webentwicklung-frage-antwort-db.com.de

Erzwingt die Ausgabe von striktem JSON

Ich möchte die rohe Ausgabe einiger MongoDB-Befehle in anderen Programmen verwenden, die JSON sprechen. Wenn ich Befehle in der Mongo-Shell ausführe, repräsentieren sie Extended JSON , - Felder im "Shell-Modus" mit speziellen Feldern wie NumberLong, Date und Timestamp. Ich sehe in der Dokumentation Verweise auf den "strikten Modus", aber ich sehe keine Möglichkeit, sie für die Shell zu aktivieren, oder eine Möglichkeit, Befehle wie db.serverStatus() in Dingen auszuführen, die do als strikte JSON-Anweisung (wie mongodump) ausgibt. Wie kann ich Mongo dazu zwingen, standardkonformes JSON auszugeben?

Es gibt mehrereandereFragen zu diesem Thema, aber ich finde keine ihrer Antworten besonders befriedigend.

23
whereswalden

Die MongoDB-Shell spricht Javascript, daher ist die Antwort einfach: Verwenden Sie JSON.stringify(). Wenn Ihr Befehl db.serverStatus() lautet, können Sie einfach Folgendes tun:

JSON.stringify(db.serverStatus())

Auf diese Weise wird nicht die richtige "strikte Modus" -Darstellung für jedes der Felder ausgegeben ({ "floatApprox": <number> } statt { "$numberLong": "<number>" }). Wenn Sie sich jedoch für standardkonforme JSON interessieren, ist dies der Trick.

23
whereswalden

Ich habe keinen Weg gefunden, dies in der Mongo-Shell zu tun, aber als Umgehung kann mongoexport Abfragen ausführen und die Ausgabe verwendet den strikten Modus und kann in andere Befehle geleitet werden, die eine JSON-Eingabe erwarten (wie json_pp oder jq). Angenommen, Sie haben den folgenden Befehl für die mongo-Shell, um eine Abfrage auszuführen, und Sie möchten eine Pipeline mit diesen Daten erstellen:

db.myItemsCollection.find({creationDate: {$gte: ISODate("2016-09-29")}}).pretty()

Konvertieren Sie diesen Mongo-Shell-Befehl in diesen Shell-Befehl und leiten Sie das Beispiel an json_pp weiter:

mongoexport --jsonArray -d myDbName -c myItemsCollection -q '{"creationDate": {"$gte": {"$date": "2016-09-29T00:00Z"}}}' | json_pp

Sie müssen die Abfrage in das strikte Modusformat konvertieren und den Datenbanknamen und den Auflistungsnamen als Argumente sowie das richtige Anführungszeichen für Ihre Shell übergeben, wie hier gezeigt.

5
jbyler

Um auf die Antwort von @jbyler aufzubauen, können Sie die numberLongs mit sed entfernen, nachdem Sie Ihre Daten erhalten haben - das ist, wenn Sie Linux verwenden.

mongoexport --jsonArray -d dbName -c collection -q '{fieldName: {$regex: ".*turkey.*"}}' | sed -r 's/\{ "[$]numberLong" : "([0-9]+)" }/"\1"/g' | json_pp
0
Kieveli