Mongo Partial Compound唯一索引|在查询中不使用

时间:2017-07-05 02:35:43

标签: mongodb

我面临一个奇怪的问题。我有一个带有defination的部分,复合,唯一索引:

createIndex({a: 1, b:1, c: 1}, {unique:1, partialFilterExpression: {c: {$type: "string"}}})

现在,当我执行查询时,根据解释计划,从不使用此索引。即使有与查询匹配的文档。

将相同的索引转换为稀疏而不是部分修复上述问题,但稀疏,复合,唯一索引存在以下问题: dealing-with-mongodb-unique-sparse-compound-indexes

Index Is Properly Created

Query returns a document

Index is not Used

1 个答案:

答案 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" }}]})