MongoDB中嵌套对象中数组和文本字段的复合索引

时间:2015-03-06 22:00:05

标签: arrays mongodb indexing

如果我在数组中有元素的索引和"正常" element,但如果它们在嵌套对象中,则似乎不使用索引的第二部分。 数据示例:

db.col1.insert(
{rt:{
   a:"1", 
   b: [{c:"1"}, {d:"2"}]
}})

指数:

db.col1.ensureIndex({"rt.b.c":1, "rt.a":1})

查询:

db.col1.find({"rt.a":1, "rt.b.c":1}).explain()
  "winningPlan" : {
                  "stage" : "KEEP_MUTATIONS",
                  "inputStage" : {
                          "stage" : "FETCH",
                          "filter" : {
                                  "rt.a" : {
                                          "$eq" : 1
                                  }
                          },
                          "inputStage" : {
                                  "stage" : "IXSCAN",
                                  "keyPattern" : {
                                          "rt.b.c" : 1,
                                          "rt.a" : 1
                                  },
                                  "indexName" : "rt.b.c_1_rt.a_1",
                                  "isMultiKey" : true,
                                  "direction" : "forward",
                                  "indexBounds" : {
                                          "rt.b.c" : [
                                                  "[1.0, 1.0]"
                                          ],
                                          "rt.a" : [
                                                  "[MinKey, MaxKey]"
                                          ]
                                  }
                          }
                  }

所以rt.a索引的一部分似乎没有被使用,我不明白为什么。如果我对根元素执行相同操作,则使用两个索引部分:

> db.col1.insert({a:"1", b: [{c:"1"}, {d:"2"}]})
> db.col1.ensureIndex({"b.c":1, "a":1})
> db.col1.find({"a":1, "b.c":1}).explain()
 {
            "winningPlan" : {
                    "stage" : "FETCH",
                    "inputStage" : {
                            "stage" : "IXSCAN",
                            "keyPattern" : {
                                    "b.c" : 1,
                                    "a" : 1
                            },
                            "indexName" : "b.c_1_a_1",
                            "isMultiKey" : true,
                            "direction" : "forward",
                            "indexBounds" : {
                                    "b.c" : [
                                            "[1.0, 1.0]"
                                    ],
                                    "a" : [
                                            "[1.0, 1.0]"
                                    ]
                            }
                    }

我知道如果两个对象在同一个数组中,你可以使用$ elemMatch,但在我的例子中,它们不是也不应该受MongoDB行为的影响。

0 个答案:

没有答案