0

私のコレクションには次のような文書構造があります。

{
    "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"
    }
}

インデックスは1つの境界を使用しません-これは説明です:

{
    "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です

4

1 に答える 1

4

両方のインデックス境界を使用する場合の問題は、ドキュメントが $gt を満たす 1 つの eDate と $lt を満たす別の eDate を持つ可能性があることです。クエリのセマティクスはそのドキュメントと一致するため、両方のインデックス制約を使用した場合よりも多くのドキュメントを参照する必要があります。

このような場合に役立つものがあります: $elemMatch ( http://docs.mongodb.org/manual/reference/projection/elemMatch/を参照) および cursor.min / cursor.max ( http://docs .mongodb.org/manual/reference/method/cursor.min/ )。

于 2013-06-24T11:05:34.453 に答える