当我运行db.collection.explain().find()
时,它会出现以下错误;
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
我目前正在使用Javascript NodeJS来创建mongo-shell的子进程。并将explain命令发送到该进程并监听其输出。获得输出后,我需要通过JSON.parse()方法将其解析为javascript对象。基于这个用例,我将mongo json扩展转换为标准javascript对象的简单方法是什么?
答案 0 :(得分:0)
请参阅MongoDB Extended JSON上的文档。基本上,它归结为MongoDB扩展JSON以添加JSON不支持的其他数据类型。为了保留该类型信息,各种工具使用“严格”模式(向JSON RFC确认)或“mongo shell”模式,它使用NumberLong()和ISODate()等符号来表示数据类型,并且通常不可解析使用JSON解析器。
根据您正在做的事情,您可以使用mongoexport
,它可以选择以严格模式输出。但是,如果您正在尝试评估查询的解释计划,我认为除非您将解释计划插入到临时集合中,然后将其移植到外部,否则我认为不会有效。
您最好的选择是使用编程语言(例如Java,Perl,Python,C#等)以及相应的MongoDB驱动程序之一来完成您尝试完成的任何脚本。在那里,您将获得更多的灵活性和强大的功能来检索和解析数据。
由于您在编辑中提到您正在使用Node.js,因此您可以使用explain选项直接从Node获取解释输出,而无需生成子流程。
这是一个非常基本的例子:
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);
});
});