2013-03-15 114 views
1

下面是一个例子查询:Mongo查询在mongo shell中运行,但不在bash mongo中--eval?

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

查询工作在蒙戈外壳。然而,在Ubuntu的bash脚本或直接壳

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

只是坐下来想一想。这似乎是在bash退出了上一个问题“(应该立刻注意到!)相反,我用'(或我想你可以使用/。”对于JSON),所以查询的样子:

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

0

如果查询包含mongo运算符,即$ne,$gt等,使用--evalbash double quotes也有另一个可能的问题,因为运算符以$开头。

双引号:

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

单引号:

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

猛砸试图与变量替换这些运营商。

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

因此,我总是建议使用单引号--eval

0

使用单引号成双,

例如为:

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

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

如果您使用的是$符号,比如$正则表达式,你需要逃脱它:

mongo fivemin --eval 'printjson(db.readings.find({"_id.s" : {"\$regex":"2012-11-01T*"} }).count())'