Ich bin 2 Tage alt mit Mongo und habe einen SQL-Hintergrund. Wie bei MySQL ist es sehr praktisch, sich in der MySQL-Befehlszeile zu befinden und die Ergebnisse einer Abfrage in einer Datei auf dem Computer auszugeben. Ich versuche zu verstehen, wie ich dasselbe mit Mongo machen kann , während ich in der Shell bin
Ich kann die Ausgabe einer gewünschten Abfrage problemlos abrufen, indem ich mich außerhalb der Shell befinde und den folgenden Befehl ausführe:
mongo localhost:27017/dbname --eval "printjson(db.collectionName.findOne())" >> sample.json
Der obige Weg ist in Ordnung, aber es erfordert, dass ich die Mongo-Shell verlasse oder eine neue Terminal-Registerkarte öffne, um diesen Befehl auszuführen. Es wäre sehr praktisch, wenn ich dies einfach tun könnte, während ich mich noch in der Shell befinde.
P.S: Die Frage ist ein Ableger einer Frage, die ich am ALSO gestellt habe
AFAIK, gibt es keine interaktive Option für die Ausgabe in eine Datei, gibt es eine vorherige SO Frage im Zusammenhang mit diesem: Drucken von Mongodb-Shell-Ausgabe in Datei
Sie können jedoch die gesamte Shell-Sitzung protokollieren, wenn Sie den Befehl Shell with tee aufgerufen haben:
$ mongo | tee file.txt
MongoDB Shell version: 2.4.2
connecting to: test
> printjson({this: 'is a test'})
{ "this" : "is a test" }
> printjson({this: 'is another test'})
{ "this" : "is another test" }
> exit
bye
Dann erhalten Sie eine Datei mit folgendem Inhalt:
MongoDB Shell version: 2.4.2
connecting to: test
> printjson({this: 'is a test'})
{ "this" : "is a test" }
> printjson({this: 'is another test'})
{ "this" : "is another test" }
> exit
bye
Um alle Befehle zu entfernen und nur die json-Ausgabe beizubehalten, können Sie einen Befehl wie den folgenden verwenden:
tail -n +3 file.txt | egrep -v "^>|^bye" > output.json
Dann bekommst du:
{ "this" : "is a test" }
{ "this" : "is another test" }
Wenn Sie die Shell mit den Argumenten script-file, db address und --quiet aufrufen, können Sie die Ausgabe (zum Beispiel mit print ()) in eine Datei umleiten:
mongo localhost/mydatabase --quiet myScriptFile.js > output
Wir können es so machen -
mongo db_name --quiet --eval 'DBQuery.shellBatchSize = 2000; db.users.find({}).limit(2000)' > users.json
Mit dem Argument shellBatchSize
wird festgelegt, wie viele Zeilen der Mongo-Client drucken darf. Der Standardwert ist 20.
myScriptFile.js
// Switch current database to "mydatabase"
db = db.getSiblingDB('mydatabase');
// The mark for cutting initial output off
print("CUT_TO_HERE");
// Main output
// "toArray()" method allows to get all records
printjson( db.getCollection('jobs').find().toArray() );
Senden der Abfrage vom Terminal
-z
Schlüssel von sed
erlaubt die Ausgabe als einzelne mehrzeilige Zeichenkette
$> mongo localhost --quiet myScriptFile.js | sed -z 's/^.*CUT_TO_HERE\n//' > output.json
Es kann hilfreich sein, die Anzahl der angezeigten Ergebnisse zu erhöhen
In der Mongo Shell>
DBQuery.shellBatchSize = 3000
und dann können Sie alle Ergebnisse auf einmal aus dem Terminal auswählen und in eine Textdatei einfügen.
Es ist das, was ich tun werde:)