MongoDB没有返回正确的JSON

时间:2017-04-13 23:36:29

标签: json mongodb

当我运行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对象的简单方法是什么?

1 个答案:

答案 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);
  });
});