2014-03-28 45 views
1

當我想要mongo和AND兩個條件時,結果不一致。當我明確$和他們時,一切都很好。Mongodb不一致隱式和/或

> db.test.insert({t:ISODate("2014-03-28")}) 
> db.test.find({t:ISODate("2014-03-28")}) 
{ "t" : ISODate("2014-03-28T00:00:00Z") } 

隔離條件句,所有的好:

> db.test.find({t:{"$lte":ISODate("2014-03-27")}}) 
> db.test.find({t:{"$gte":ISODate("2014-03-27")}}) 
{ "t" : ISODate("2014-03-28T00:00:00Z") } 
> db.test.find({t:{"$gte":ISODate("2014-03-29")}}) 
> db.test.find({t:{"$lte":ISODate("2014-03-29")}}) 
{ "t" : ISODate("2014-03-28T00:00:00Z") } 

這些工作,你會從一個隱含的 「和」 期待:

> db.test.find({t:{"$gte":ISODate("2014-03-27")},t:{"$lte":ISODate("2014-03-27")}}) 
> db.test.find({t:{"$lte":ISODate("2014-03-29")},t:{"$gte":ISODate("2014-03-29")}}) 
> db.test.find({t:{"$gte":ISODate("2014-03-27")},t:{"$lte":ISODate("2014-03-29")}}) 
{ "t" : ISODate("2014-03-28T00:00:00Z") } 
> db.test.find({t:{"$lte":ISODate("2014-03-29")},t:{"$gte":ISODate("2014-03-27")}}) 
{ "t" : ISODate("2014-03-28T00:00:00Z") } 

然而,這些的行爲像 「或」:

> db.test.find({t:{"$lte":ISODate("2014-03-27")},t:{"$gte":ISODate("2014-03-27")}}) 
{ "t" : ISODate("2014-03-28T00:00:00Z") } 
> db.test.find({t:{"$gte":ISODate("2014-03-29")},t:{"$lte":ISODate("2014-03-29")}}) 
{ "t" : ISODate("2014-03-28T00:00:00Z") } 

而一切正常預計,無論訂單,明確的「$和」「

> db.test.find({"$and": [{t:{"$lte":ISODate("2014-03-27")}},{t:{"$gte":ISODate("2014-03-27")}}]}) 
> db.test.find({"$and": [{t:{"$gte":ISODate("2014-03-27")}},{t:{"$lte":ISODate("2014-03-27")}}]}) 
> db.test.find({"$and": [{t:{"$gte":ISODate("2014-03-29")}},{t:{"$lte":ISODate("2014-03-29")}}]}) 
> db.test.find({"$and": [{t:{"$lte":ISODate("2014-03-29")}},{t:{"$gte":ISODate("2014-03-29")}}]}) 

任何想法是怎麼回事?

回答

2

在你的behave like "or"的情況下,實際發生的情況是每個對象只能有一個同名的鍵,所以只有第二個t值被使用。

1

要擴大@JohnnyHK:

db.test.find({t:{"$lte":ISODate("2014-03-29"), "$gte":ISODate("2014-03-27")}}) 

是做

的正確方法