Ich verwende MongoDB 2.2.2 für 32-Bit-Windows7-Computer. Ich habe eine komplexe Aggregationsabfrage in einer .js-Datei. Ich muss diese Datei auf der Shell ausführen und die Ausgabe in eine CSV-Datei leiten. Ich stelle sicher, dass die Abfrage einen "flachen" JSON (keine verschachtelten Schlüssel) zurückgibt, sodass sie von Natur aus in eine ordentliche CSV konvertiert werden kann.
Ich weiß über load()
und eval()
. eval()
erfordert, dass ich die gesamte Abfrage in die Shell einfüge und nur printjson()
innerhalb des Skripts zulasse, während ich csv benötige. Und der zweite Weg: load()
..Es druckt die Ausgabe auf dem Bildschirm und wieder im JSON-Format.
Gibt es eine Möglichkeit, wie Mongo diese Konvertierung von json nach csv durchführen kann? (Ich benötige eine CSV-Datei, um Diagramme für die Daten vorzubereiten). Ich denke:
1. Entweder hat Mongo einen eingebauten Befehl dafür, den ich momentan nicht finden kann.
2. Mongo kann es nicht für mich tun; Ich kann die JSON-Ausgabe höchstens an eine Datei senden, die ich dann selbst in CSV konvertieren muss.
3. Mongo kann die JSON-Ausgabe an eine temporäre Sammlung senden, deren Inhalt leicht mongoexported
im CSV-Format vorliegen kann. Ich denke jedoch, dass nur kartenreduzierte Abfragen Ausgabesammlungen unterstützen. Ist das richtig? Ich brauche es für eine Aggregationsabfrage.
Danke für jede Hilfe :)
quelle
Antworten:
Ich weiß, dass diese Frage alt ist, aber ich verbringe eine Stunde damit, eine komplexe Abfrage nach CSV zu exportieren, und wollte meine Gedanken teilen. Zuerst konnte ich keinen der JSON-CSV-Konverter zum Laufen bringen (obwohl dieser vielversprechend aussah). Am Ende habe ich die CSV-Datei manuell in mein Mongo-Skript geschrieben.
Dies ist eine einfache Version, aber im Wesentlichen das, was ich getan habe:
print("name,id,email"); db.User.find().forEach(function(user){ print(user.name+","+user._id.valueOf()+","+user.email); });
Dies habe ich gerade die Abfrage an stdout weitergeleitet
mongo test export.js > out.csv
Wo
test
ist der Name der Datenbank, die ich benutze?quelle
use <database>
test
im letzten Befehl angegebene Name ist der Name der Datenbank. Ersetzen Sie ihn einfach durch den Namen Ihrer Datenbank.Der integrierte Export von Mongo funktioniert einwandfrei, es sei denn, Sie möchten Datenmanipulationen wie Formatdatum, verdeckte Datentypen usw. vornehmen.
Der folgende Befehl wirkt als Zauber.
mongoexport -h localhost -d databse -c collection --type=csv --fields erpNum,orderId,time,status -q '{"time":{"$gt":1438275600000}, "status":{"$ne" :"Cancelled"}}' --out report.csv
quelle
--type=csv
statt--csv
.Weitere Antworten erweitern:
Ich fand die Antwort von @ GEverding am flexibelsten. Es funktioniert auch mit Aggregation:
test_db.js
print("name,email"); db.users.aggregate([ { $match: {} } ]).forEach(function(user) { print(user.name+","+user.email); } });
Führen Sie den folgenden Befehl aus, um die Ergebnisse zu exportieren:
Leider wird der CSV-Datei zusätzlicher Text hinzugefügt, für den die Datei verarbeitet werden muss, bevor wir sie verwenden können:
MongoDB shell version: 3.2.10 connecting to: test_db
Aber wir können dafür sorgen, dass die Mongo-Shell diese Kommentare nicht mehr ausspuckt und nur das druckt, wonach wir gefragt haben, indem wir die
--quiet
Flagge übergebenquelle
Folgendes können Sie versuchen:
print("id,name,startDate") cursor = db.<collection_name>.find(); while (cursor.hasNext()) { jsonObject = cursor.next(); print(jsonObject._id.valueOf() + "," + jsonObject.name + ",\"" + jsonObject.stateDate.toUTCString() +"\"") }
Speichern Sie das in einer Datei, sagen Sie "export.js". Führen Sie den folgenden Befehl aus:
quelle
Werfen Sie einen Blick auf diese
für die Ausgabe von Mongo Shell in Datei. Es gibt keine Unterstützung für die Ausgabe von CSV aus der Mongos-Shell. Sie müssten das Javascript selbst schreiben oder einen der vielen verfügbaren Konverter verwenden. Google "konvertiere json in csv" zum Beispiel.
quelle
Ich wäge hier nur mit einer schönen Lösung ab, die ich verwendet habe. Dies ähnelt der obigen Lösung von Lucky Soni, da es die Aggregation unterstützt, jedoch keine feste Codierung der Feldnamen erfordert.
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); }
Speichern Sie dies als
.js
Datei. In diesem Fall rufen wir es aufexample.js
und führen es mit der Mongo-Befehlszeile wie folgt aus:quelle