Używam MongoDB 2.2.2 na komputerze z 32-bitowym systemem Windows7. Mam złożone zapytanie agregujące w pliku .js. Muszę wykonać ten plik w powłoce i skierować dane wyjściowe do pliku CSV. Zapewniam, że zapytanie zwraca „płaski” plik JSON (bez zagnieżdżonych kluczy), więc jest z natury konwertowany na schludny plik CSV.
Wiem o load()
i eval()
. eval()
wymaga ode mnie wklejenia całego zapytania do powłoki i pozwala tylko printjson()
wewnątrz skryptu, podczas gdy potrzebuję csv. Drugi sposób: load()
... Drukuje wynik na ekranie i znowu w formacie json.
Czy istnieje sposób, w jaki Mongo może wykonać tę konwersję z json na csv? (Potrzebuję pliku csv, aby przygotować wykresy na danych). Myślę:
1. Każda mongo ma wbudowane polecenie, którego nie mogę teraz znaleźć.
2. Mongo nie może tego zrobić za mnie; Mogę co najwyżej wysłać dane wyjściowe json do pliku, który następnie muszę sam przekonwertować na csv.
3. Mongo może wysłać dane wyjściowe json do tymczasowej kolekcji, której zawartość można łatwo zapisać mongoexported
w formacie csv. Ale myślę, że tylko zapytania ograniczające mapę obsługują zbiory danych wyjściowych. Czy to prawda? Potrzebuję go do zapytania agregującego.
Dzięki za wszelką pomoc :)
źródło
Odpowiedzi:
Wiem, że to pytanie jest stare, ale spędziłem godzinę próbując wyeksportować złożone zapytanie do csv i chciałem podzielić się swoimi przemyśleniami. Najpierw nie udało mi się uruchomić żadnego z konwerterów json na csv (chociaż ten wyglądał obiecująco). Skończyło się na tym, że ręcznie zapisałem plik csv w moim skrypcie mongo.
To jest prosta wersja, ale zasadniczo to, co zrobiłem:
print("name,id,email"); db.User.find().forEach(function(user){ print(user.name+","+user._id.valueOf()+","+user.email); });
To właśnie wysłałem zapytanie do stdout
mongo test export.js > out.csv
gdzie
test
jest nazwa bazy danych, której używam.źródło
use <database>
test
w ostatnim poleceniu jest nazwa bazy danych, po prostu zastąp ją nazwą swojej bazy danych.Wbudowany eksport Mongo działa dobrze, chyba że chcesz manipulować danymi, takimi jak data formatu, ukryte typy danych itp.
Następujące polecenie działa jak urok.
mongoexport -h localhost -d databse -c collection --type=csv --fields erpNum,orderId,time,status -q '{"time":{"$gt":1438275600000}, "status":{"$ne" :"Cancelled"}}' --out report.csv
źródło
--type=csv
zamiast--csv
.Rozszerzanie innych odpowiedzi:
Uważam, że odpowiedź @ GEverding jest najbardziej elastyczna. Działa również z agregacją:
test_db.js
print("name,email"); db.users.aggregate([ { $match: {} } ]).forEach(function(user) { print(user.name+","+user.email); } });
Wykonaj następujące polecenie, aby wyeksportować wyniki:
Niestety, dodaje dodatkowy tekst do pliku CSV, który wymaga przetworzenia pliku, zanim będziemy mogli go użyć:
MongoDB shell version: 3.2.10 connecting to: test_db
Ale możemy sprawić, że skorupa mongo przestanie wypluwać te komentarze i wydrukuje tylko to, o co poprosiliśmy, przekazując
--quiet
flagęźródło
Oto, czego możesz spróbować:
print("id,name,startDate") cursor = db.<collection_name>.find(); while (cursor.hasNext()) { jsonObject = cursor.next(); print(jsonObject._id.valueOf() + "," + jsonObject.name + ",\"" + jsonObject.stateDate.toUTCString() +"\"") }
Zapisz to w pliku, powiedz „export.js”. Uruchom następujące polecenie:
źródło
Spójrz na to
do wyprowadzania z powłoki mongo do pliku. Nie ma wsparcia dla wypisywania csv z powłoki mongos. Musiałbyś sam napisać javascript lub użyć jednego z wielu dostępnych konwerterów. Na przykład Google „przekonwertuje json na csv”.
źródło
Właśnie tu ważę z ładnym rozwiązaniem, którego używałem. Jest to podobne do rozwiązania Lucky Soni powyżej, ponieważ obsługuje agregację, ale nie wymaga twardego kodowania nazw pól.
cursor = db.<collection_name>.<my_query_with_aggregation>; headerPrinted = false; while (cursor.hasNext()) { item = cursor.next(); if (!headerPrinted) { print(Object.keys(item).join(',')); headerPrinted = true; } line = Object .keys(item) .map(function(prop) { return '"' + item[prop] + '"'; }) .join(','); print(line); }
Zapisz to jako
.js
plik, w tym przypadku nazwiemy goexample.js
i uruchomimy z linią poleceń mongo w następujący sposób:źródło