2017-04-13 3 views
0

Wenn ich db.collection.explain().find() starte, gibt es den folgenden Fehler;MongoDB gibt kein richtiges JSON zurück

The last field in this json object has a double quote problem: `"totalChildMillis" : NumberLong(2)`. 

Wenn ich dieses Objekt zu analysieren, habe ich eine Ausnahme sagen, dass NumberLong(2) sollte doppelt angegeben werden. Gibt es eine Möglichkeit, dass MongoDB ein Standard-JSON-Objekt zurückgibt?

{ 
    "executionStages":{ 
     "stage": "SINGLE_SHARD", 
     "nReturned": 10000, 
     "executionTimeMillis": 3, 
     "totalKeysExamined": 0, 
     "totalDocsExamined": 10000, 
     "totalChildMillis": NumberLong(2) 
    } 
} 

EDIT1

I Javascript NodeJS bin derzeit ein Teilprozess eines Mongo-Shell zu erstellen. Und senden Sie den Befehl explain an diesen Prozess und hören Sie auf seine Ausgabe. Sobald ich die Ausgabe erhalten habe, muss ich es zu einem JavaScript-Objekt durch JSON.parse() -Methode analysieren. Basierend auf diesem Anwendungsfall, was ist der leichtere Weg für mich, die mongo json-Erweiterung als Standard-JavaScript-Objekt zu verwenden?

Antwort

0

Siehe die Dokumentation unter MongoDB Extended JSON. Grundsätzlich kommt es darauf an, dass MongoDB JSON erweitert, um zusätzliche Datentypen hinzuzufügen, die JSON nicht unterstützt. Um diese Typinformationen zu erhalten, verwenden verschiedene Werkzeuge entweder den "strikten" Modus (der den JSON-RFC bestätigt) oder den "Mongo-Shell" -Modus, der Notationen wie NumberLong() und ISODate() zur Darstellung von Datentypen verwendet und im Allgemeinen nicht analysierbar ist Verwenden eines JSON-Parsers.

Je nachdem, was Sie tun, können Sie mongoexport verwenden, die eine Option zur Ausgabe im strikten Modus hat. Aber wenn Sie versuchen, den Explain-Plan einer Abfrage zu bewerten, glaube ich nicht, dass das funktionieren wird, wenn Sie den EXPLAIN-Plan nicht in eine temporäre Sammlung einfügen und dann mongoexportieren.

Ihre beste Wette ist, was auch immer Sie mit einer Programmiersprache (z. B. Java, Perl, Python, C# usw.) und einem der entsprechenden MongoDB-Treiber versuchen. Dort haben Sie viel mehr Flexibilität und Leistung beim Abrufen und Parsen von Daten.

Da Sie in Ihrer Bearbeitung angegeben haben, dass Sie Node.js verwenden, können Sie die Option explain verwenden, um die EXPLAIN-Ausgabe direkt vom Knoten zu erhalten, ohne einen Unterprozess erzeugen zu müssen.

Hier ist ein sehr einfaches Beispiel:

var url = 'mongodb://localhost:27017/test'; 
var MongoClient = require('mongodb').MongoClient; 
MongoClient.connect(url, function(err, db) { 
    assert.equal(null, err); 
    var collection = db.collection('test'); 
    collection.find({}, {explain:true}).each(function(err, doc) { 
    if(doc != null) 
     console.dir(doc); 
    }); 
}); 
+0

Vielen Dank für Ihre Antwort. Ich habe meinen Anwendungsfall in der Frage hinzugefügt. Könnten Sie sich Ihren Vorschlag ansehen und ihn wissen lassen? –

+0

Ja, ich benutze Node.js, aber ich habe keinen Treiber verwendet. Ich habe einen Unterprozess von Mongo-Shell in Nodejs erstellt und höre auf seinen Standard-Ausgabestrom. Gibt es also einen Weg für Mongo-Shell Returns Standard-JSON-Ausgabe? –

+0

Nein, das ist nicht möglich. Und wie gesagt, der Ansatz des Fahrers ist der beste Ansatz. – helmy

Verwandte Themen