以下是一个示例查询:
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()
可以运作。
答案 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}