Gibt es eine Möglichkeit, die Ausgabe der MongoDB-Shell in eine Datei "hübsch" zu drucken?


101

Insbesondere möchte ich die Ergebnisse eines Mongodb find()in eine Datei drucken . Das JSON-Objekt ist zu groß, sodass ich nicht das gesamte Objekt mit der Shell-Fenstergröße anzeigen kann.

Antworten:


216

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

command.js muss eine lesbare Datei sein, die in Ihrem aktuellen Verzeichnis vorhanden ist und das Javascript enthält, das Sie ausführen möchten.
Asya Kamsky

Wie mache ich das für eine entfernte Mongo-Datenbank? Ich habe es versucht, mongo blah.mongolab.com:33478/blah -u user -p pass --eval "my query" >> dump.txtaber es gab mir JavaScript execution failed: SyntaxError: Unexpected token ILLEGAL.
Sheharyar

Dieser Fehler bedeutet, dass das, was nach --eval in Ihren Anführungszeichen steht, keine legale Syntax ist. Ich empfehle, einfache Anführungszeichen außerhalb ganzer Ausdrücke zu verwenden. Wenn Sie Anführungszeichen innerhalb dieser Ausdrücke benötigen, verwenden Sie dafür doppelte Anführungszeichen.
Asya Kamsky

2
Option 2 ist wirklich die einzige Option, wenn Sie mehr als eine Handvoll Ergebnisse haben, da sie in Option 1 einfach bei "Geben Sie" es "für mehr" anhält.
Tomty

2
nicht wirklich @Tomty - Die Größe des Shell-Batches kann mit einer Variablen innerhalb der Shell gesteuert werden. Sie können DBQuery.shellBatchSize = 10000 in Ihre .mongodbrc.js-Datei einfügen und es wird nach 10000 Ergebnissen statt 20 "gestoppt".
Asya Kamsky

29

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 teegeschrieben wurde.

Beachten Sie, dass die Ausgabe möglicherweise Escape-Sequenzen und anderen Müll enthält, da die Mongo-Shell eine interaktive Sitzung erwartet. lessbehandelt diese anmutig.


12

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.jsund Ihre Datenbank befindet foo, sieht er folgendermaßen aus:

./mongo foo find.js >> out.json

Dies hat bei mir nicht funktioniert, sondern nur die Shell-Version und den Datenbanknamen ausgedruckt out.json. mongo foo < find.js > out.jsonfunktionierte.
James Brown

1
Diese Antwort wurde geschrieben, bevor die Tools in Go und vor vielen Versionen neu geschrieben wurden.
Adam Comerford

10

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.


Dies. Lassen Sie sich nicht durch .jsErweiterung irreführen . Sie können all diese netten Mongo-Shell-Abfragen schreiben, ohne sie zu ändern.
AD

4

Mit printund können JSON.stringifySie einfach ein gültiges JSON Ergebnis erstellen .
Verwenden Sie das --quietFlag, um das Shell-Rauschen vom Ausgang zu filtern.
Verwenden Sie das --norcFlag, um eine .mongorc.jsAuswertung 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 teezum 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!


2

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


2

Ich habe es geschafft, das Ergebnis mit der Funktion writeFile () zu speichern .

> writeFile("/home/pahan/output.txt", tojson(db.myCollection.find().toArray()))

Die Mongo-Shell-Version war 4.0.9


1

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

0

Als Antwort von Neodan ist Mongoexport sehr nützlich mit -qOption für die Abfrage. Es wird auch ObjectIdin das Standardformat von JSON konvertiert "$oid". Z.B:

mongoexport -d yourdb -c yourcol --jsonArray --pretty -q '{"field": "filter value"}' -o output.json

0

Mit diesem Befehl können Sie Folgendes erreichen:

mongo admin -u <userName> -p <password> --quiet --eval "cursor = rs.status(); printjson(cursor)" > output.json

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.