我面临一个奇怪的问题。我有一个带有defination的部分,复合,唯一索引:
createIndex({a: 1, b:1, c: 1}, {unique:1, partialFilterExpression: {c: {$type: "string"}}})
现在,当我执行查询时,根据解释计划,从不使用此索引。即使有与查询匹配的文档。
将相同的索引转换为稀疏而不是部分修复上述问题,但稀疏,复合,唯一索引存在以下问题: dealing-with-mongodb-unique-sparse-compound-indexes
答案 0 :(得分:1)
如部分索引的query coverage文档中所述:
如果在不完整的结果集中使用索引结果,MongoDB将不会将部分索引用于查询或排序操作。
要使用部分索引,查询必须包含过滤器表达式(或指定过滤器表达式子集的已修改过滤器表达式)作为其查询条件的一部分。
在您的设置中,您可以在{c: {$type: "string"}}
上创建部分索引过滤。
您的查询条件为{a:"1", b:"p", c:"2"}
,或三个相等比较的查询形式({a: eq, b: eq, c: eq}
)。由于此查询形状不包含$type
上的c
过滤器,因此query planner必须考虑适合形状的查询应与任何数据类型的值匹配,并且部分索引不可行完成结果的候选人。
一些使用部分索引的示例查询(使用MongoDB 3.4.5测试):
// Search on {a, b} with c criteria matching the index filter
db.mydb.find({a:"1", b:"p", c: { $type: "string" } })
// Search on {a,b,c} and use $and to include the type of c
db.mydb.find({a:"1", b:"p", $and: [{ c: "2"} , {c: { $type: "string" }}]})