如果我在数组中有元素的索引和"正常" 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行为的影响。