尝试使用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: [ {
但事先在mongoexport中进行Date
的乘法运算:
mongoexport -d event -c listing -q '{"created_at":new Date(1221029382000)}'
作品!
为什么mongo在这两个上下文中以不同方式评估查询?
答案 0 :(得分:8)
mongoexport
命令行实用程序支持以 JSON 格式传递查询,但您正在尝试评估 JavaScript 在你的查询中。
JSON格式最初源自JavaScript的对象表示法,但JSON文档的内容可以在JavaScript解释器中进行eval()
解析。
您应该将JSON视为“结构化数据”,并将JavaScript视为“可执行代码”。事实上,对于您正在运行的查询,有两种不同的上下文。
mongo
命令行实用程序是interactive JavaScript shell,它包含一个JavaScript解释器以及一些用于处理MongoDB的帮助程序函数。虽然JavaScript对象格式与JSON类似,但您也可以使用JavaScript对象,函数调用和运算符。
1221029382*1000
的示例是数学运算的结果,如果您在mongo
shell中运行它,它将由JavaScript解释器执行;在JSON中,它是新Date的无效值,因此mongoexport以“解析JSON字符串失败”错误退出。
答案 1 :(得分:0)
我在执行mongoexport
时也遇到此错误,但原因不同。我会在这里分享我的解决方案,因为我在试图解决我的问题时最终在这个SO页面上。
我知道这与这个问题没什么关系,但是这篇文章的标题在谷歌中提到了,所以既然我得到了完全相同的错误,我会添加一个答案。希望它可以帮助某人。
我试图在Windows控制台中执行MongoId _id
查询。问题是我需要在 double 引号中包装JSON查询,而ObjectId 也必须是双引号(不是单引号!)。所以我不得不逃避ObjectId引用。
mongoexport -u USERNAME -pPASSWORD -d DATABASE -c COLLECTION --query“{_ id:ObjectId(\”5148894d98981be01e000011 \“)}”
如果我在Windows上用单引号包装JSON查询,我会收到此错误:
ERROR: too many positional options
如果我在ObjectId周围使用单引号,我会收到此错误:
Assertion: 10340:Failure parsing JSON string near: _id
所以,是的。祝你好运。