Antworten:
Die Shell bietet einige nette, aber versteckte Funktionen, da es sich um eine interaktive Umgebung handelt.
Wenn Sie Befehle aus einer Javascript-Datei über mongo command.js ausführen, erhalten Sie kein ganz identisches Verhalten.
Es gibt zwei Möglichkeiten, dies zu umgehen.
(1) Fälschen Sie die Shell aus und lassen Sie sie glauben, dass Sie sich im interaktiven Modus befinden
$ mongo dbname << EOF > output.json
db.collection.find().pretty()
EOF
oder
(2) verwenden Sie Javascript, um das Ergebnis von a find()
in einen druckbaren JSON zu übersetzen
mongo dbname command.js > output.json
Dabei enthält command.js Folgendes (oder ein gleichwertiges Element):
printjson( db.collection.find().toArray() )
Dadurch wird das Array der Ergebnisse hübsch gedruckt, einschließlich [ ]
- wenn Sie nicht möchten, dass Sie über das Array und printjson()
jedes Element iterieren können .
Übrigens, wenn Sie nur eine einzige Javascript-Anweisung ausführen, müssen Sie sie nicht in eine Datei einfügen, sondern können Folgendes verwenden:
$ mongo --quiet dbname --eval 'printjson(db.collection.find().toArray())' > output.json
mongo blah.mongolab.com:33478/blah -u user -p pass --eval "my query" >> dump.txt
aber es gab mir JavaScript execution failed: SyntaxError: Unexpected token ILLEGAL
.
Da Sie dies auf einem Terminal tun und nur einen Datensatz auf vernünftige Weise überprüfen möchten, können Sie einen Trick wie den folgenden verwenden:
mongo | tee somefile
Verwenden Sie die Sitzung wie gewohnt - db.collection.find().pretty()
oder was auch immer Sie tun müssen, ignorieren Sie die lange Ausgabe und beenden Sie sie. Eine Abschrift Ihrer Sitzung befindet sich in der Datei, in die tee
geschrieben wurde.
Beachten Sie, dass die Ausgabe möglicherweise Escape-Sequenzen und anderen Müll enthält, da die Mongo-Shell eine interaktive Sitzung erwartet. less
behandelt diese anmutig.
Fügen Sie einfach die Befehle, die Sie ausführen möchten, in eine Datei ein, übergeben Sie sie zusammen mit dem Datenbanknamen an die Shell und leiten Sie die Ausgabe in eine Datei um. Wenn sich Ihr Befehl find in find.js
und Ihre Datenbank befindet foo
, sieht er folgendermaßen aus:
./mongo foo find.js >> out.json
out.json
. mongo foo < find.js > out.json
funktionierte.
Stellen Sie Ihre Abfrage (z. B. db.someCollection.find().pretty()
) in eine Javascript-Datei, sagen wir query.js
. Führen Sie es dann in der Shell Ihres Betriebssystems mit dem folgenden Befehl aus:
mongo yourDb < query.js > outputFile
Das Abfrageergebnis befindet sich in der Datei 'outputFile'.
Standardmäßig druckt Mongo die ersten 20 Dokumente IIRC aus. Wenn Sie mehr möchten, können Sie in der Mongo-Shell einen neuen Wert für die Stapelgröße definieren, z
DBQuery.shellBatchSize = 100
.
.js
Erweiterung irreführen . Sie können all diese netten Mongo-Shell-Abfragen schreiben, ohne sie zu ändern.
Mit print
und können JSON.stringify
Sie einfach ein gültiges JSON
Ergebnis erstellen .
Verwenden Sie das --quiet
Flag, um das Shell-Rauschen vom Ausgang zu filtern.
Verwenden Sie das --norc
Flag, um eine .mongorc.js
Auswertung zu vermeiden . (Ich musste es wegen eines von mir verwendeten hübschen Formatierers tun, der eine ungültige JSON- Ausgabe erzeugt.) Verwenden Sie das DBQuery.shellBatchSize = ?
Ersetzen ?
durch das Limit des tatsächlichen Ergebnisses, um Paging zu vermeiden.
Verwenden Sie tee
zum Schluss die Terminalausgabe in eine Datei:
// Shell:
mongo --quiet --norc ./query.js | tee ~/my_output.json
// query.js:
DBQuery.shellBatchSize = 2000;
function toPrint(data) {
print(JSON.stringify(data, null, 2));
}
toPrint(
db.getCollection('myCollection').find().toArray()
);
Hoffe das hilft!
Mit dieser Antwort von Asya Kamsky habe ich ein einzeiliges Fledermausskript für Windows geschrieben. Die Linie sieht so aus:
mongo --quiet %1 --eval "printjson(db.%2.find().toArray())" > output.json
Dann kann man es ausführen:
exportToJson.bat DbName CollectionName
Es gibt auch Mongoexport dafür, aber ich bin mir nicht sicher, seit welcher Version es verfügbar ist.
Beispiel:
mongoexport -d dbname -c collection --jsonArray --pretty --quiet --out output.json
Mit diesem Befehl können Sie Folgendes erreichen:
mongo admin -u <userName> -p <password> --quiet --eval "cursor = rs.status(); printjson(cursor)" > output.json