强制mongodb输出严格的JSON

whe*_*den 30 shell json mongodb bson

我想在其他讲JSON的程序中使用一些MongoDB命令的原始输出.当我在蒙戈shell中运行命令,他们代表扩展JSON,在"shell模式"领域,具有特殊的领域,如NumberLong,DateTimestamp.我看引用文档中的"严格模式",但我看不出有什么办法把它的壳,或像运行命令的方式db.serverStatus()在事情输出严格JSON一样mongodump.如何强制Mongo输出符合标准的JSON?

关于这个主题还有其他几个 问题,但我没有发现他们的任何答案特别令人满意.

whe*_*den 31

MongoDB shell讲Javascript,所以答案很简单:使用JSON.stringify().如果您的命令是db.serverStatus(),那么您可以简单地执行此操作:

JSON.stringify(db.serverStatus())
Run Code Online (Sandbox Code Playgroud)

这不会输出每个字段({ "floatApprox": <number> }而不是{ "$numberLong": "<number>" })的正确"严格模式"表示,但如果你关心的是获得符合标准的JSON,那么这就行了.

  • 这也是错误的.作为`JSON.stringify({"a":NumberLong(1)})`出现为`{"a":{"floatApprox":1}}`这完全不是[扩展JSON](http:// docs.mongodb.org/manual/reference/mongodb-extended-json/)格式.我想在你再寻求自我答案之前,你应该多研究一下这些材料. (3认同)
  • 问题的关键是如何让 shell 吐出可以由符合标准的 JSON 解析器解析的内容。这实现了该目标。我将编辑答案以澄清这一点。 (2认同)
  • 你能提出改进意见吗? (2认同)

jby*_*ler 5

我还没有找到在mongo shell中执行此操作的方法,但作为一种解决方法,mongoexport可以运行查询并且其输出使用严格模式,并且可以通过管道传输到其他期望JSON输入的命令(例如json_ppjq).例如,假设您有以下mongo shell命令来运行查询,并且您希望使用该数据创建管道:

db.myItemsCollection.find({creationDate: {$gte: ISODate("2016-09-29")}}).pretty()
Run Code Online (Sandbox Code Playgroud)

将mongo shell命令转换为此shell命令,为了示例,将管道路由到`json_pp:

mongoexport --jsonArray -d myDbName -c myItemsCollection -q '{"creationDate": {"$gte": {"$date": "2016-09-29T00:00Z"}}}' | json_pp
Run Code Online (Sandbox Code Playgroud)

您需要将查询转换为严格模式格式,并将数据库名称和集合名称作为参数传递,并为shell正确引用,如此处所示.