尝试使用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在这两个上下文中以不同的方式评估查询?
该mongoexport
命令行实用程序支持传递查询JSON格式,但您要评估的JavaScript在您的查询.
JSON格式最初源自JavaScript的对象表示法,但JSON文档的内容可以在不eval()
使用JavaScript解释器的情况下进行解析.
您应该将JSON视为表示" 结构化数据 ",将JavaScript视为" 可执行代码 ".事实上,对于您正在运行的查询,有两种不同的上下文.
该mongo
命令行实用程序是一个交互式的JavaScript壳,其包括JavaScript解释器以及用于与MongoDB的工作一些辅助功能.虽然JavaScript对象格式与JSON类似,但您也可以使用JavaScript对象,函数调用和运算符.
你的例子1221029382*1000
是数学运算的结果,如果你在mongo
shell中运行它,它将由JavaScript解释器执行; 在JSON中,它是新Date的无效值,因此mongoexport以"解析JSON字符串失败"错误退出.