强制mongodb输出严格的JSON

强制mongodb输出严格的JSON,json,mongodb,shell,bson,Json,Mongodb,Shell,Bson,我想在其他讲JSON的程序中使用一些MongoDB命令的原始输出。当我在mongo shell中运行命令时,它们表示“shell模式”中的字段,带有特殊字段,如NumberLong、Date和Timestamp。我在文档中看到了对“strict mode”的引用,但我看不到为shell打开它的方法,也看不到在输出严格JSON的东西中运行命令的方法,如db.serverStatus(),如mongodump。如何强制Mongo输出符合标准的JSON 在这个话题上有很多人,但我觉得他们的答案没有一个

我想在其他讲JSON的程序中使用一些MongoDB命令的原始输出。当我在mongo shell中运行命令时,它们表示“shell模式”中的字段,带有特殊字段,如
NumberLong
Date
Timestamp
。我在文档中看到了对“strict mode”的引用,但我看不到为shell打开它的方法,也看不到在输出严格JSON的东西中运行命令的方法,如
db.serverStatus()
,如
mongodump
。如何强制Mongo输出符合标准的JSON


在这个话题上有很多人,但我觉得他们的答案没有一个特别令人满意。

MongoDB shell讲Javascript,所以答案很简单:使用
JSON.stringify()
。如果您的命令是
db.serverStatus()
,则只需执行以下操作:

JSON.stringify(db.serverStatus())

这将不会输出每个字段的正确“严格模式”表示形式(
{“floatAbrox”:}
而不是
{“$numberLong”:“}
),但是如果您关心的是获得符合标准的JSON,这将起作用。

我在mongo shell中没有找到这样做的方法,但作为一种解决方法,
mongoexport
可以运行查询,其输出使用严格模式,并可以通过管道传输到其他需要JSON输入的命令(例如
JSON\u pp
jq
)。例如,假设您使用以下mongo shell命令来运行查询,并且希望使用该数据创建管道:

db.myItemsCollection.find({creationDate: {$gte: ISODate("2016-09-29")}}).pretty()
将该mongo shell命令转换为该shell命令,为便于示例,将其管道化为`json_pp:

mongoexport --jsonArray -d myDbName -c myItemsCollection -q '{"creationDate": {"$gte": {"$date": "2016-09-29T00:00Z"}}}' | json_pp

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

要基于@jbyler的答案,您可以在获取数据后去掉使用的numberLongs,如果您使用的是linux

mongoexport --jsonArray -d dbName -c collection -q '{fieldName: {$regex: ".*turkey.*"}}' | sed -r 's/\{ "[$]numberLong" : "([0-9]+)" }/"\1"/g' | json_pp

编辑:这将转换给定文档,但不适用于文档列表。将
find
更改为
findOne

添加

.forEach(function(results){results._id=results._id.toString();printjson(results)})`
findOne()
将输出有效的JSON

例如:

db
  .users
  .findOne()
  .forEach(function (results) {
    results._id = results._id.toString();
    printjson(results)
  })
来源:

如果是findOne

JSON.stringify(db.Bill.findOne({'a': '123'}))
如果是光标

db.Bill.find({'a': '123'}).forEach(r=>print(JSON.stringify(r)))

将输出

[{a:123},{a:234},]
最后一个将在最后一个项目后有一个“,”,请将其删除


你搞错了。shell使用的“严格”语法是
{“a”:NumberLong(1)}
等,而shell根本不支持的“扩展JSON”是由
mongoexport
等工具使用的,后者执行
“a”:{“$NumberLong”:“1”}
这是可解析的JSON形式
mongodump
只是在数据文件上转储BSON。您不正确。清楚地显示NumberLong类型的“严格模式”表示是
{“$NumberLong”:“}
,而“shell模式”表示是
NumberLong(“”
)。我可以编辑这个问题来澄清“扩展JSON”和“shell模式”之间的区别,就像我说的。完全相反。扩展JSON就是您所说的“严格”。语义并不会真正改变问题或答案,但FWIW,即之前链接的文档指定“shell模式”和“严格模式”都是JSON的扩展,因此“扩展JSON”包括这两种模式。如果有其他文档表明不是这样,我很想看看。Blakes Seven请阅读strict mode->{“$oid”:“}shell mode->ObjectId(“”)strict=standard JSONA,这也是错误的。stringify({“a”:NumberLong(1)})的格式是
{“a”:{“floatApprox”:1}
,这完全不是格式。我认为在你进行更多的自我回答之前,你应该对材料进行更多的研究。问题的关键是如何让shell吐出一些可以由符合标准的JSON解析器解析的内容。这就实现了这一目标。我将编辑答案以澄清这一点。你能提出改进建议吗?如果我们也能得到“强制mongodb输出扩展JSON”的答案,那就太好了。。。但这不是你要问的,你的摇滚。你让我开心!非常感谢。我不知道这件事!我只希望它支持聚合。不够通用。我有一个大的文档,很难单独处理每个字段。
[{a:123},{a:234},]