2012-09-18 39 views
2

有人可以告訴我這兩個查詢之間的區別嗎?

db.foo.find({ $and: [{a: 1}, {a: {$gt: 5}}]}) 

db.foo.find({a:1, a:{$gt:5}}) 

編輯 好讓我改變的問題一點點。假設以下

dev(mongod-2.2.0)>db.foo.insert({UserID: 1, Status:'unread' }) 
dev(mongod-2.2.0)>db.foo.insert({UserID: 1, Status:'unread' }) 
dev(mongod-2.2.0)>db.foo.insert({UserID: 1, Status:'unread' }) 
dev(mongod-2.2.0)>db.foo.insert({UserID: 1, Status:'unread' }) 
dev(mongod-2.2.0)>db.foo.insert({UserID: 1, Status:'unread' }) 
dev(mongod-2.2.0)>db.foo.insert({UserID: 1, Status:'unread' }) 
dev(mongod-2.2.0)>db.foo.insert({UserID: 1, Status:'unread' }) 
dev(mongod-2.2.0)>db.foo.insert({UserID: 1, Status:'unread' }) 

而且我想找到用戶ID 1.執行所有未讀郵件我這樣做

db.foo.find({UserID:1, Status:'unread'}) 

或本

db.foo.find({$and: [{UserID:1},{Status:'unread']}) 

回答

1

隨着$and這兩個條件都被考慮在查詢時。如果沒有$and,查詢中只考慮a的最後一個規範。這似乎也發生在從mongo shell插入。

在你編輯的問題,我肯定會用下面db.foo.find({UserID:1, Status:'unread'})

例子:

> db.sotest.insert({a : 1}) 
> db.sotest.insert({a : 2}) 
> db.sotest.insert({a : 6}) 
> db.sotest.insert({a : 7}) 
> db.sotest.insert({a : [1, 7]}) 
> db.sotest.find() 
{ "_id" : ObjectId("50587c0164433af6a99c988f"), "a" : 1 } 
{ "_id" : ObjectId("50587c0564433af6a99c9890"), "a" : 2 } 
{ "_id" : ObjectId("50587c0d64433af6a99c9891"), "a" : 6 } 
{ "_id" : ObjectId("50587c1064433af6a99c9892"), "a" : 7 } 
{ "_id" : ObjectId("50587c1f64433af6a99c9893"), "a" : [ 1, 7 ] } 
> db.sotest.find({a:1, a:{$gt:5}}) 
{ "_id" : ObjectId("50587c0d64433af6a99c9891"), "a" : 6 } 
{ "_id" : ObjectId("50587c1064433af6a99c9892"), "a" : 7 } 
{ "_id" : ObjectId("50587c1f64433af6a99c9893"), "a" : [ 1, 7 ] } 
> db.sotest.find({a:{$gt:5}, a:1}) 
{ "_id" : ObjectId("50587c0164433af6a99c988f"), "a" : 1 } 
{ "_id" : ObjectId("50587c1f64433af6a99c9893"), "a" : [ 1, 7 ] } 
> db.sotest.find({$and : [{a:{$gt:5}}, {a:1}]}) 
{ "_id" : ObjectId("50587c1f64433af6a99c9893"), "a" : [ 1, 7 ] } 
> 
0

第二個是無效因爲你不能有一個具有兩個屬性的對象,名稱爲a。第一個是有效的,所以這是不同的。

編輯

在你更新的問題,你一定要使用:

db.foo.find({UserID:1, Status:'read'}); 

,因爲它是更自然的語法。

+0

兩個查詢是有效的。我在mongo shell上測試了它們,並且兩者都返回了相同的結果 – Optimus

+0

可能valid在shell接受它的時候並不是很合適的詞,但是它並不合理,因爲第一個'a'值被忽略,最終執行的結果是: 'db.foo.find({a:{$ gt:5}})' – JohnnyHK

+0

除了自然語法,兩者之間還有什麼區別嗎? – Optimus