我想在其他使用JSON的程序中使用一些MongoDB命令的原始输出。当我在mongo shell中运行命令时,它们代表Extended JSON," shell模式"中的字段,包含NumberLong
,Date
和{{1}等特殊字段}。我在文档中看到了对#34; strict mode"的引用,但我认为没有办法为shell启用它,或者在做的事情中运行像Timestamp
这样的命令的方法/ em>输出严格的JSON,如db.serverStatus()
。如何强制Mongo输出符合标准的JSON?
答案 0 :(得分:27)
MongoDB shell会说Javascript,所以答案很简单:使用mongodump
。如果您的命令是JSON.stringify()
,那么您可以这样做:
db.serverStatus()
这不会输出正确的"严格模式"每个字段的表示形式(JSON.stringify(db.serverStatus())
而不是{ "floatApprox": <number> }
),但如果你关心的是获得符合标准的JSON,那么这就可以了。
答案 1 :(得分:5)
我还没有找到在mongo shell中执行此操作的方法,但作为一种解决方法,mongoexport
可以运行查询,其输出使用严格模式,可以通过管道传输到其他期望JSON输入的命令(例如json_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正确引用,如下所示。
答案 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/