Mongodb索引没有';不能在范围查询中使用一个边界

Mongodb索引没有';不能在范围查询中使用一个边界,mongodb,Mongodb,我的收藏中有这样的文档结构: { "deviceId" : "9113", "data" : { "qIdx" : 106 "points" : [ { "eDate" : "2013-06-10T00:00:13.000Z" } , { "eDate" : "2013-06-10T00:00:14.000Z" } ] } , "rdate" : { "$dat

我的收藏中有这样的文档结构:

{
    "deviceId" : "9113",
    "data" : { 
        "qIdx" : 106 
        "points" : [ 
            { "eDate" : "2013-06-10T00:00:13.000Z" } ,
            { "eDate" : "2013-06-10T00:00:14.000Z" }
        ]
    } , 
    "rdate" : { "$date" : "2013-05-30T22:25:04.359Z"} , 
    "_id" : { "$oid" : "51a7d1c0debcab563502cc41" }
}
我有索引:

{deviceId: 1, data.points.eDate: 1}
当我执行以下查询时:

{
    deviceId: "9113", 
    data.points.eDate: {
        $gt: "2013-05-11T00:00:00.000Z",
        $lt:"2013-05-12T00:00:00.000Z"
    }
}
索引不使用一个边界-这是解释:

{
    "cursor" : "BtreeCursor deviceId_1_data.points.eDate_1" ,
    "nscanned" : 4015 ,
    "nscannedObjects" : 4015 ,
    "n" : 10 , "millis" : 8297 ,
    "nYields" : 103 ,
    "nChunkSkips" : 0 ,
    "isMultiKey" : true ,
    "indexOnly" : false ,
    "indexBounds" : {
        "deviceId" : [[ "9113" , "9113"]],
        "data.points.eDate" : [
            [ "2013-05-11T00:00:00.000Z" , { }]
        ]
    }
}

我的mongodb版本是2.0.7

使用两个索引边界的问题是,一个文档可能有一个满足$gt的eDate和另一个满足$lt的eDate。因为查询的语义将与该文档匹配,因此它必须查看比使用两个索引边界更多的文档


在这些类型的情况下,有很多东西可以提供帮助:$elemMatch(请参阅)和cursor.min/cursor.max().

使用两个索引边界的问题是,一个文档可能有一个满足$gt的eDate和另一个满足$lt的eDate。因为查询的语义将与该文档匹配,因此它必须查看比使用两个索引边界更多的文档


在这些类型的情况下,有很多东西可以帮助您:$elemMatch(请参阅)和cursor.min/cursor.max()。

您的$lt和$gt参数具有相同的值,那么您希望您的边界是什么?我还强烈建议您升级到最新的MongoDB版本(2.4.4)。我很确定这在2.2/2.4中有了很大的改进。嗯,我试过了,得到了同样的结果。我建议您在Google Groups邮件列表上问这个问题(请随时告诉他们我已经把您发送到了那里):我已经在2.4.4中尝试过了。您的$lt和$gt参数具有相同的值,那么您希望您的界限是什么?我还强烈建议您升级到最新的MongoDB版本(2.4.4)。我很确定这在2.2/2.4中有了很大的改进。嗯,我试过了,得到了同样的结果。我建议你在Google Groups邮件列表上问这个问题(请随时告诉他们我已经把你送到了那里):我用2.4.4试过了。我只是检查了一下,用elemMatch:db.so.find({deviceId:'9113','data.points':{$elemMatch:{'eDate':{$gt:'2013-05-11T00:00.000Z',$lt:'2013-05-12T00:00.000Z}}})。解释();--还是一样output@Derick即将进入睡眠状态,但我认为SERVER-6050是需要的,或者是稍微不同的模式,其中eDates是$elemMatch的数组,在这种特定情况下可以工作,但希望cursor.min/cursor.max可以工作。像SERVER-3766这样的min/max有一些限制,但我认为在这种情况下应该是可以的。我只是检查了一下,并且使用了elemMatch:db.so.find({deviceId:'9113','data.points':{$elemMatch:{'eDate':{$gt:'2013-05-11T00:00.000Z',$lt:'2013-05-12T00:00.000Z}})。explain();--还是一样output@Derick即将进入睡眠状态,但我认为SERVER-6050是需要的,或者是稍微不同的模式,其中eDates是$elemMatch的数组,在这种特定情况下可以工作,但希望cursor.min/cursor.max可以工作。像SERVER-3766这样的min/max有一些限制,但我认为在这种情况下应该可以。