4

这是一个示例查询:

db.readings.find( {"_id.s" : ISODate("2012-11-01T00:05:00Z") } ).count()

查询在 mongo shell 中工作。但是,在 bash 脚本中或直接在 Ubuntu shell 中

mongo fivemin --eval "printjson(db.readings.find( {"_id.s" : ISODate("2012-11-01T00:05:00Z") } ).count())"

返回一个SyntaxError: missing : after property id (shell eval):1

我似乎找不到查询的问题。我恢复到{ "_id" : {"s" : ...} },它仍然给出了同样的问题。find().count()但是有效。

4

5 回答 5

5

在 bash shell 中有同样的问题。

由于双引号,这将失败:

mongo fivemin --eval "printjson(db.readings.find( {"_id.s" : ISODate("2012-11-01T00:05:00Z") } ).count())"

但是在单引号中使用 eval 字符串它可以工作:

mongo fivemin --eval 'printjson(db.readings.find( {"_id.s" : ISODate("2012-11-01T00:05:00Z") } ).count())'

如果你使用像 $regex 这样的 $ 符号,你需要转义它:

mongo fivemin --eval 'printjson(db.readings.find( {"_id.s" : {"\$regex":"2012-11-01T*"} } ).count())'
于 2017-02-07T20:22:23.987 回答
1

使用单引号成双引号,

例如:

mongo fivemin --eval "printjson(db.readings.find( {'_id.s' : ISODate('2012-11-01T00:05:00Z') } ).count())"
于 2013-12-20T16:37:28.197 回答
0

如果查询包含 mongo 运算符 ie等,则使用--evalwith bash 双引号还有另一个可能的问题,因为运算符以.$ne$gt$

双引号:

$ echo " '$ne': null "
$ => '': null

单引号:

$ echo ' "$ne": null '
$ => "$ne": null

Bash 尝试用变量替换这些运算符。

$ ne = 'test'
$ echo " '$ne': null "
$ => 'test': null

所以,我总是建议使用--eval单引号。

于 2013-12-20T15:26:08.307 回答
0

只是坐着想了想。bash 在 " 上退出似乎是一个问题(应该立即注意到!)。相反,我使用了 ' (或者我猜你可以使用 /" 作为 JSON)所以查询看起来像:

printjson(db.readings.find({'_id.s' : ISODate('2013-01-01T00:05:00Z') }).count())"

于 2013-03-15T15:16:06.380 回答
0

处理此问题的最佳方法是在 var 中构建 mongo 命令。然后使用evalcommand 执行 mongo 命令:

mongo_update_query="db.collectionName.update({ name:\""${some_name}"\", \
{ \$addToSet: { nick_names : { \$each : [ ${name_array} ] }}});"

mongo_cmd_str=$(echo "mongo --host ${mongo_host} --port ${mongo_port} ${mongo_database} --eval '${mongo_update_query}'")

# the actual call to mongo query
eval ${mongo_cmd_str}
于 2018-07-27T12:07:34.990 回答