Mongodb不一致含义和/或

时间:2014-03-28 12:17:58

标签: mongodb

当我想要mongo和AND两个条件时,我得到了不一致的结果。当我明确$和他们时,一切都很好。

> 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 个答案:

答案 0 :(得分:2)

behave like "or"的情况下,实际发生的事情是每个对象只能有一个具有相同名称的密钥,因此只使用第二个t值。

答案 1 :(得分:1)

扩展@JohnnyHK:

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

是正确的方法吗