2013-01-23 13 views
51

Używam MongoDB 2.2.2 dla 32-bitowego komputera z Windows7. Mam złożone kwerendy agregacji w pliku .js. Muszę wykonać ten plik na powłoce i skierować wyjście do pliku CSV. Zapewniam, że zapytanie zwraca "płaski" json (bez zagnieżdżonych klawiszy), więc jest on nieodłącznie wymienialny na czysty CSV.

Wiem o load() i eval(). eval() wymaga, aby wkleić całe zapytanie do powłoki i pozwala tylko printjson() w skrypcie, podczas gdy potrzebuję CSV. I drugi sposób: load() .. To drukuje dane wyjściowe na ekranie i ponownie w formacie json.
Czy istnieje sposób, w jaki Mongo może wykonać tę konwersję z json do csv? (Potrzebuję pliku csv do przygotowania wykresów na danych). Myślę:
1. Albo mongo ma wbudowane polecenie dla tego, którego teraz nie mogę znaleźć.
2. Mongo nie może tego zrobić dla mnie; Mogę co najwyżej wysłać dane wyjściowe json do pliku, który sam muszę przekonwertować na CSV.
3. Mongo może wysyłać dane wyjściowe json do kolekcji tymczasowej, której zawartość może być z łatwością mongoexported do formatu csv. Ale myślę, że tylko raporty map-reduce obsługują kolekcje wyjściowe. Czy to prawda? Potrzebuję go do zapytania o agregację.Przekierowanie wyjścia mongo do pliku csv

dzięki za pomoc :)

+1

Jeśli jest coś, czego nie często, warto rozważyć napisanie osobnego EXE przy użyciu .NET , python lub możesz użyć NodeJs; każdy ma natywny sterownik, który ułatwiłby wykonanie twojego kodu i wytworzy pożądaną moc wyjściową. – WiredPrairie

+0

Mam na myśli odpowiedź Zachary'ego na http://stackoverflow.com/questions/4130849/convert-json-format-to-csv-format-for-ms-excel i jestem w stanie konwertować z json na csv. Ale czy jako alternatywa mogę przekazać json do kolekcji, a następnie wykonać mongoexport? –

+0

Polecam tylko zbudować małą wiązkę przewodów za pomocą Węzła i sterownika MongoDB dla NodeJS, a następnie można wykonać dowolny kod, który chcesz. Szybko uzyskasz pożądane rezultaty, bez potrzeby posiadania powłoki. Byłoby to bardzo łatwe do utrzymania (i debuggable). – WiredPrairie

Odpowiedz

114

Wiem, że to pytanie jest stare, ale spędzam godzinę próbując wyeksportować złożone zapytanie do CSV i chciałem podzielić się swoimi przemyśleniami. Po pierwsze nie mogłem uzyskać żadnego z konwerterów json do CSV do pracy (chociaż this wyglądało obiecująco). To, co zrobiłem, to ręczne zapisanie pliku csv w moim skrypcie mongo.

Jest to prosta wersja, ale w istocie to, co zrobiłem:

print("name,id,email"); 
db.User.find().forEach(function(user){ 
    print(user.name+","+user._id.valueOf()+","+user.email); 
}); 

To po prostu rurami zapytanie do stdout

mongo test export.js > out.csv 

gdzie test jest nazwą bazy używam.

+0

Jak określić, w którym db znajduje się kolekcja User? – Nelu

+2

@NeluMalancea sprawdź MongoDB [docs] (http://docs.mongodb.org/manual/tutorial/getting-started-with-mongo-shell/), że mają te informacje. Możesz określić DB, dodając "użyj " na szczycie skryptu – GEverding

+2

W rzeczywistości, ponieważ pomoce powłoki, takie jak "użyj " nie są javascript, nie są dozwolone. Zobacz http://docs.mongodb.org/manual/tutorial/write-scripts-for-the-mongo-shell/. Zamiast tego uruchom swój skrypt w następujący sposób: conn = new Mongo(); db = conn.getDB ("twoja_nazwa_danych"); –

5

Wystarczy popatrzeć na this

dla outputing z Mongo skorupy do pliku. Nie ma obsługi wyjścia csv z powłoki mongos. Trzeba by napisać skrypt javascript samodzielnie lub skorzystać z jednego z wielu dostępnych konwerterów. Google "przekonwertuj json na csv" na przykład.

5

Oto co można 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 że w pliku, powiedzieć "export.js". Uruchom następujące polecenie:

mongo <host>/<dbname> -u <username> -p <password> export.js > out.csv 
49

Mongo jest w wbudowany eksport działa poprawnie, chyba że chcesz do dowolnej manipulacji danych, takich jak format daty, tajnych typów danych itp

następujące prace dowodzenia jak uroku.

mongoexport -h localhost -d databse -c collection --csv 
--fields erpNum,orderId,time,status 
-q '{"time":{"$gt":1438275600000}, "status":{"$ne" :"Cancelled"}}' 
--out report.csv 
+0

Awesome it is! –

+8

Dzięki za tonę! Podpowiedź: teraz jest to '--type = csv' zamiast' --csv'. – Jan

0

Rozszerzanie inne odpowiedzi:

znalazłem @ odpowiedź GEverding najbardziej elastyczne.Działa również z agregacją:

test_db.js

print("name,email"); 

db.users.aggregate([ 
    { $match: {} } 
]).forEach(function(user) { 
     print(user.name+","+user.email); 
    } 
}); 

wykonać następujące polecenie do wyników eksportowych:

mongo test_db <./test_db.js>> ./test_db.csv 

Niestety, dodaje dodatkowy tekst do pliku CSV, który wymaga przetworzenia plik przed użyciem:

MongoDB shell version: 3.2.10 
connecting to: test_db 

Ale możemy zrobić Mongo shell zatrzymać wypluwa te komentarze i drukować tylko to, co mamy prosić o przepuszczając --quiet flagę

mongo --quiet test_db <./test_db.js>> ./test_db.csv