尝试对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中进行乘法:
Date
mongoexport -d event -c listing -q '{"created_at":new Date(1221029382000)}'
作品!
为什么mongo在这两种情况下对查询的评估不同?
该mongoexport命令行实用程序支持传递查询 JSON 格式,但您要评估 的JavaScript 在您的查询。
mongoexport
JSON格式最初源自JavaScript的对象表示法,但是可以解析JSON文档的内容,而无需eval()在JavaScript解释器中对其进行编辑。
eval()
您应该将JSON表示为“ 结构化数据 ”,将JavaScript表示为“ 可执行代码 ”。因此,实际上,您正在运行的查询有两种不同的上下文。
该mongo命令行实用程序是一个交互式的JavaScript壳,其包括JavaScript解释器以及用于与MongoDB的工作一些辅助功能。尽管JavaScript对象格式看起来类似于JSON,但是您也可以使用JavaScript对象,函数调用和运算符。
mongo
您的示例1221029382*1000是一个数学运算的结果,如果您在mongo外壳中运行该数学运算,那么该JavaScript解释器将执行该数学运算;在JSON中,它是新日期的无效值,因此mongoexport正在退出,并显示“无法解析JSON字符串”错误。
1221029382*1000