当我想要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")}}]})
关于发生了什么的任何想法?
答案 0 :(得分:2)
在behave like "or"
的情况下,实际发生的事情是每个对象只能有一个具有相同名称的密钥,因此只使用第二个t
值。
答案 1 :(得分:1)
扩展@JohnnyHK:
db.test.find({t:{"$lte":ISODate("2014-03-29"), "$gte":ISODate("2014-03-27")}})
是正确的方法吗