Mongo查询在mongo shell中工作但在bash mongo --eval中不起作用?

时间:2013-03-15 15:11:41

标签: mongodb

以下是一个示例查询:

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()可以运作。

5 个答案:

答案 0 :(得分:4)

在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())'

答案 1 :(得分:0)

坐下来想一想。这似乎是一个问题,bash退出“(应该立即注意到!)。而是我使用'(或者我猜你可以使用/”作为JSON)所以查询看起来像:

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

答案 2 :(得分:0)

如果查询包含mongo运算符,即--eval$ne等,则$gt使用$还有另一个可能的问题,因为运算符以{{1}开头}。

双引号:

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

单引号:

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

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

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

因此,我始终建议将--eval与单引号一起使用。

答案 3 :(得分:0)

使用单引号加倍,

e.g:

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

答案 4 :(得分:0)

处理此问题的最佳方法是在var中构建mongo命令。然后使用eval命令执行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}