2013-03-15 146 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())'