一尘不染

mongoexport JSON解析错误

json

尝试对mongoexport使用查询会导致错误。但是mongo-client会评估相同的查询,而不会出错。

在mongo-client中:

db.listing.find({"created_at":new Date(1221029382*1000)})

使用mongoexport:

mongoexport -d event -c listing -q '{"created_at":new Date(1221029382*1000)}'

产生的错误:

Fri Nov 11 17:44:08 Assertion: 10340:Failure parsing JSON string near: 
$and: [ { 
0x584102 0x528454 0x5287ce 0xa94ad1 0xa8e2ed 0xa92282 0x7fbd056a61c4 
0x4fca29 
mongoexport(_ZN5mongo11msgassertedEiPKc+0x112) [0x584102] 
mongoexport(_ZN5mongo8fromjsonEPKcPi+0x444) [0x528454] 
mongoexport(_ZN5mongo8fromjsonERKSs+0xe) [0x5287ce] 
mongoexport(_ZN6Export3runEv+0x7b1) [0xa94ad1] 
mongoexport(_ZN5mongo4Tool4mainEiPPc+0x169d) [0xa8e2ed] 
mongoexport(main+0x32) [0xa92282] 
/lib/libc.so.6(__libc_start_main+0xf4) [0x7fbd056a61c4] 
mongoexport(__gxx_personality_v0+0x3d9) [0x4fca29] 
assertion: 10340 Failure parsing JSON string near: $and: [ {

但是Date预先在mongoexport中进行乘法:

mongoexport -d event -c listing -q '{"created_at":new Date(1221029382000)}'

作品!

为什么mongo在这两种情况下对查询的评估不同?


阅读 227

收藏
2020-07-27

共1个答案

一尘不染

mongoexport命令行实用程序支持传递查询 JSON
格式,但您要评估 的JavaScript 在您的查询。

JSON格式最初源自JavaScript的对象表示法,但是可以解析JSON文档的内容,而无需eval()在JavaScript解释器中对其进行编辑。

您应该将JSON表示为“ 结构化数据 ”,将JavaScript表示为“ 可执行代码 ”。因此,实际上,您正在运行的查询有两种不同的上下文。

mongo命令行实用程序是一个交互式的JavaScript壳,其包括JavaScript解释器以及用于与MongoDB的工作一些辅助功能。尽管JavaScript对象格式看起来类似于JSON,但是您也可以使用JavaScript对象,函数调用和运算符。

您的示例1221029382*1000是一个数学运算的结果,如果您在mongo外壳中运行该数学运算,那么该JavaScript解释器将执行该数学运算;在JSON中,它是新日期的无效值,因此mongoexport正在退出,并显示“无法解析JSON字符串”错误。

2020-07-27