强制mongodb输出严格的JSON

时间:2015-08-19 13:39:42

标签: json mongodb shell bson

我想在其他使用JSON的程序中使用一些MongoDB命令的原始输出。当我在mongo shell中运行命令时,它们代表Extended JSON," shell模式"中的字段,包含NumberLongDate和{{1}等特殊字段}。我在文档中看到了对#34; strict mode"的引用,但我认为没有办法为shell启用它,或者在做的事情中运行像Timestamp这样的命令的方法/ em>输出严格的JSON,如db.serverStatus()。如何强制Mongo输出符合标准的JSON?

关于此主题有several other questions,但我发现他们的任何答案都不是特别令人满意。

5 个答案:

答案 0 :(得分:27)

MongoDB shell会说Javascript,所以答案很简单:使用mongodump。如果您的命令是JSON.stringify(),那么您可以这样做:

db.serverStatus()

这不会输出正确的&#34;严格模式&#34;每个字段的表示形式(JSON.stringify(db.serverStatus()) 而不是{ "floatApprox": <number> }),但如果你关心的是获得符合标准的JSON,那么这就可以了。

答案 1 :(得分:5)

我还没有找到在mongo shell中执行此操作的方法,但作为一种解决方法,mongoexport可以运行查询,其输出使用严格模式,可以通过管道传输到其他期望JSON输入的命令(例如json_ppjq)。例如,假设您有以下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正确引用,如下所示。

答案 2 :(得分:1)

在 findOne 的情况下

JSON.stringify(db.Bill.findOne({'a': '123'}))

如果是光标

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

print('[') + db.Bill.find().limit(2).forEach(r=>print(JSON.stringify(r) + ',')) + print(']')

会输出

[{a:123},{a:234},]
<块引用>

最后一个将在最后一个项目之后有一个“,”...删除它

答案 3 :(得分:0)

为了建立@jbyler的答案,你可以在获得数据后使用sed删除numberLongs - 即如果你正在使用linux。

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

答案 4 :(得分:-1)

编辑:这将转换给定的文档,但不适用于文档列表。将 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)
  })

来源:https://www.mydbaworld.com/mongodb-shell-output-valid-json/