为什么MongoDB产生无效的JSON?没有引用ObjectId,打破了jq解析器

Mat*_*t R 5 json mongodb

我搜索了论坛,看到很多人有类似的问题,但不是这个问题.

我认为我的问题是最简单的形式,必须有一些我不知道的东西,因为没有人问它.

我有一个调用MongoDB脚本的shell脚本,并将结果存入文件中.然后我想用jq解析该文件.

jq正在崩溃,因为查询的输出不是有效的JSON.罪犯是ObjectId.关于"ALL JSON ALL THE TIME"产生无效JSON的事情我完全失去了.

我很确定我缺少一些基本的东西.

我有一个名为MyMongoScript.js的文件.其内容如下:

db.WorkflowJobs.find().sort({"STATUS":1}).forEach(printjson)
Run Code Online (Sandbox Code Playgroud)

我使用以下命令调用MyMongScript.js:

mongo -u $MONGO_U -p $MONGO_P $MONGO_DB -quiet --eval "var DATE_TO_RUN=\"$DATE_TO_RUN\"" MyMongoScript.js  
Run Code Online (Sandbox Code Playgroud)

这是STDOUT的结果:

{
"_id" : ObjectId("52816fd50bc9efc3e6d8e33f"),
"WORK_TYPE" : "HIVE",
"Script_Name" : "upload_metrics_LANDING_to_HIST.sql",
"Stop_On_Fail" : true,
"STATUS" : "READY",
"START_TS" : "NULL",
"END_TS" : "NULL",
"DURATION" : "NULL",
"INS_TS" : "Mon Nov 11 2013 16:01:25 GMT-0800 (PST)"
}
Run Code Online (Sandbox Code Playgroud)

以下是jsonlint.com所说的内容:

Parse error on line 2:
{    "_id": ObjectId("52816fd50b
------------^
Expecting 'STRING', 'NUMBER', 'NULL', 'TRUE', 'FALSE', '{', '['
Run Code Online (Sandbox Code Playgroud)

任何帮助非常感谢.

Mat*_*ter 5

试试这个MyMongoScript.js:

db.WorkflowJobs.find().sort({"STATUS":1}).forEach(function(myDoc){myDoc._id=myDoc._id.valueOf();print(tojson(myDoc))});
Run Code Online (Sandbox Code Playgroud)

关键是valueOf()将ObjectId设置为String.

编辑留下了一个paren.

  • @MattR这对你来说可能看起来毫无意义,但请注意 Sammaye 关于 BSON 与 JSON 的评论,因为它是你问题的根源 (2认同)