你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

Mongoexport引号问题踩坑

2021-10-25 23:31:35

今天想按_id导出一些数据
发现find可以搜到但是mongoexport总是exported 0 records

文档关于mongoexport --query部分:
You must enclose the query document in single quotes ('{ ... }') to ensure that it does not interact with your shell environment.
必须用单引号扩起来query部分

The query must be in Extended JSON v2 format (either relaxed or canonical/strict mode), including enclosing the field names and operators in quotes:
query必须把列名和操作符都括起来。

实验如下,首先在库里确定导出条件无误:

> db.umaru.find({"_id":{"$in":['202110251025102500001','202110251025102500002']} })
--这里条件用的单引号
{ "_id" : "202110251025102500001", "name" : "test" }
{ "_id" : "202110251025102500002", "name" : "test" }
> db.umaru.find({"_id":{"$in":["202110251025102500001","202110251025102500002"]} })
--双引号
{ "_id" : "202110251025102500001", "name" : "test" }
{ "_id" : "202110251025102500002", "name" : "test" }

发现单双引号都能查出结果来,但是:

mongoexport -d umaru -c umaru -q '{"_id":{"$in":["202110251025102500001","202110251025102500002"]} }' --type json -o exp.json
2021-10-25T21:30:57.013+0800	connected to: mongodb://localhost/
2021-10-25T21:30:57.017+0800	exported 2 records

 mongoexport -d umaru -c umaru -q '{"_id":{"$in":['202110251025102500001','202110251025102500002']} }' --type json -o exp.json
2021-10-25T21:31:08.594+0800	connected to: mongodb://localhost/
2021-10-25T21:31:08.598+0800	exported 0 records --单引号的导不出来

mongoexport -d umaru -c umaru -q "{'name':'Tom' }" --type json -o exp.json --导不出来
mongoexport -d umaru -c umaru -q '{"name":"Tom" }' --type json -o exp.json --可以导出

本来只针对JS的规则去查,了解到js的单双括号同种括号不能交叉,第一个单引号会找下一个单引号。但奇怪的是,为什么这句不会被前两个单引号截断?而是正常执行但返回0record?

‘{"_id":{"$in":[‘202110251025102500001’,‘202110251025102500002’]} }’

后来醒悟,因为mongoexport是跑在linux shell里的,所以是按照linux的规则匹配单双引号,这里可以在shell中打印一下:

echo '{"_id":{"$in":['202110251025102500001','202110251025102500002']} }'
{"_id":{"$in":[202110251025102500001,202110251025102500002]} }"

这里引号用的linux的规则,再放到mongo中搜一下:

> db.umaru.find({"_id":{"$in":[202110251025102500001,202110251025102500002]} }) 
> -- got nothing 
> db.umaru.find({"_id":{"$in":['202110251025102500001','202110251025102500002']} })
{ "_id" : "202110251025102500001", "name" : "test" }
{ "_id" : "202110251025102500002", "name" : "test" }
> 

果不其然,不带单括号的没有匹配到数据。
在执行mongoexport的时候是在linux环境下执行的,在find的时候是在mongo的js shell环境下执行的,虽然后者能搜到,但是因为格式原因前者在导出时并没有匹配到数据。

所以导出还是按照文档说的,-q条件前后用单引号,中间双引号应该没什么问题。

另外发现一个JS单双引号奇怪的小例子:

"'hello'" === '"hello"'
false
 "hello" ==='hello'
true

附:
Mongoexport官方文档说明