Mongo复合数组索引未被使用

时间:2015-10-09 11:03:03

标签: mongodb indexing

我的数据库中有以下对象结构。

{
  "_id": 1234,
  "dateTime": ISODate("2015-09-28T02:15:00Z"),
  "tags":[{
     "_id": 5678,
     "name":{
       "short": "GOT",
       "long" : "Game of Thrones"
     }
   },{
     "_id": 9101,
     "name":{
       "short": "Dragons",
       "long" : "Huge Dragons"
     }
  }]
}

我正在尝试使用:

进行查询
  

db.collection.find({       dateTime:{$ gte:new Date(1443398000000),$ lt:new Date(1443484740000)},       " tags._id":" d8408d19-48e4-36a0-aa23-55cd8c8415f6"}})

我创建了索引:

  

{dateTime:1," tags._id":1}

然而,当使用explain()运行查询时,它从不使用此索引。

我尝试反过来翻转索引并重新排序我的查询,但这没有帮助。

我的数据库中有大约500,000个文档。

希望有人可以提供帮助。

1 个答案:

答案 0 :(得分:0)

我只是这样查询

> db.comp.find({dateTime:{"$gte":new Date(12345),"$lte":new Date(999999999)},"ta
gs._id":5678}).explain()

这是输出

{
        "queryPlanner" : {
                "plannerVersion" : 1,
                "namespace" : "test.comp",
                "indexFilterSet" : false,
                "parsedQuery" : {
                        "$and" : [
                                {
                                        "tags._id" : {
                                                "$eq" : 5678
                                        }
                                },
                                {
                                        "dateTime" : {
                                                "$lte" : ISODate("1970-01-12T13:
46:39.999Z")
                                        }
                                },
                                {
                                        "dateTime" : {
                                                "$gte" : ISODate("1970-01-01T00:
00:12.345Z")
                                        }
                                }
                        ]
                },
                "winningPlan" : {
                        "stage" : "KEEP_MUTATIONS",
                        "inputStage" : {
                                "stage" : "FETCH",
                                "filter" : {
                                        "dateTime" : {
                                                "$gte" : ISODate("1970-01-01T00:
00:12.345Z")
                                        }
                                },
                                "inputStage" : {
                                        "stage" : "IXSCAN",
                                        "keyPattern" : {
                                                "dateTime" : 1,
                                                "tags._id" : 1
                                        },
                                        "indexName" : "dateTime_1_tags._id_1",
                                        "isMultiKey" : true,
                                        "direction" : "forward",
                                        "indexBounds" : {
                                                "dateTime" : [
                                                        "(true, new Date(9999999
99)]"
                                                ],
                                                "tags._id" : [
                                                        "[5678.0, 5678.0]"
                                                ]
                                        }
                                }

如果您看到使用了"indexName" : "dateTime_1_tags._id_1"索引。

希望它会有所帮助