2017-04-13 9 views
0

db.collection.explain().find()を実行すると、次のエラーが発生します。私は、このオブジェクトを解析する場合MongoDBが適切なJSONを返さない

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

は、私はNumberLong(2)は、二重引用符で囲む必要があるという例外が発生しました。 MongoDBが標準のJSONオブジェクトを返す方法はありますか?

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

EDIT1

私は現在のmongoシェルのサブプロセスを作成するにはJavascriptをNodeJSを使用しています。そのプロセスにexplainコマンドを送信し、その出力を待ち受けます。出力を取得したら、JSON.parse()メソッドでjavascriptオブジェクトに解析する必要があります。このユースケースに基づいて、mongo json拡張を標準のjavascriptオブジェクトに適合させるための簡単な方法は何ですか?

答えて

0

MongoDB Extended JSONのドキュメントを参照してください。基本的には、MongoDBがJSONを拡張して、JSONがサポートしないデータ型を追加するという事実になります。その型情報を保持するために、さまざまなツールは、データ型を表すためにNumberLong()やISODate()などの表記法を使用し、一般に解析可能ではない「厳密」モード(JSON RFCに確認する)または「mongoシェル」モードを使用しますJSONパーサーを使用して

何をしているかによって、厳格なモードで出力するオプションを持つmongoexportを使用できます。しかし、問合せの実行計画を評価しようとしている場合、EXPLAIN PLANをテンポラリ・コレクションに挿入してmongoexportしない限り、動作するとは思われません。

プログラミング言語(Java、Perl、Python、C#など)と対応するMongoDBドライバのいずれかを使用して、どのスクリプトを作成しても構いません。そこには、データを取得して解析する方法にはるかに柔軟性と力があります。

Node.jsを使用していると述べたので、explainオプションを使用すると、サブプロセスを生成せずにノードから直接Explain出力を取得できます。あなたの応答のための

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

ありがとう:

は、ここでは非常に基本的な例です。私はその質問にユースケースを追加しました。あなたはあなたの目を見て、私にあなたの提案を教えてもらえますか? –

+0

はいNode.jsを使用していますが、ドライバは使用しませんでした。私はnodejsにmongo-shellのサブプロセスを作り、その標準出力ストリームを聞きました。それでmongo-shellが標準のjson出力を返す方法がありますか? –

+0

不可能です。そして、私が言ったように、ドライバーのアプローチが最良のアプローチです。 – helmy

関連する問題