使用lt和gt运算符进行MongoDB查询

时间:2015-07-30 15:44:16

标签: mongodb

请问任何人可以帮助解决这个MongoDB查询吗?

我写了这个查询:

db.getCollection('epg').find({
'programs.start':{'$lte': new ISODate('2015-07-30 19:10:00.000Z')},
'programs.end':{'$gte': new ISODate('2015-07-30 19:10:00.000Z')}},
{'programs.$':1, 'name':1, 'id':1, 'broadcastDay':1})

MongoDB将此文档返回给我:

{
    "_id" : ObjectId("55ba36cb68057b06d80f766a"),
    "id" : "2",
    "broadcastDay" : "2015-07-30",
    "name" : "Prima COOL",
    "programs" : [ 
        {
            "serialNumber" : "11/340/00039/0024",
            "start" : ISODate("2015-07-30T19:25:00.000Z"),
            "end" : ISODate("2015-07-30T19:44:00.000Z")
        }
    ]
}

返回文档中的开始和结束与查询不匹配。有谁知道,为什么MongoDB会返回这个文档?我希望,结果将为空(我的集合“epg”中没有匹配的文档)。

1 个答案:

答案 0 :(得分:1)

您的查询将匹配programs数组中某些项与开始条件匹配的任何文档,并且某些元素与结束条件匹配。根据上面@ Philipp的评论,如果你想匹配programs中某些项目符合这两个条件的文档,你应该使用$elemMatch来进行查询。

您正在使用positional $ operator仅返回与查询匹配的数组的第一个元素。返回的元素与结束条件匹配,但如果您按ID撤回整个文档,您将看到programs中有更多条目,其中一个条目与开始条件匹配。