复合主键是否支持mongodb中的前缀搜索?

时间:2017-01-11 23:11:12

标签: mongodb

考虑一个集合

{ "_id" : { "a" : 1, "b" : 1 }, "c" : 1 }
{ "_id" : { "a" : 2, "b" : 3 }, "c" : 4 }
{ "_id" : { "a" : 3, "b" : 4 }, "c" : 5 }
{ "_id" : { "a" : 4, "b" : 5 }, "c" : 6 }
{ "_id" : { "a" : 5, "b" : 6 }, "c" : 7 }
{ "_id" : { "a" : 1, "b" : 5 }, "c" : 6 }
{ "_id" : { "a" : 1, "b" : -5 }, "c" : 6 }
发出类似

的查询时,在此类集合中

db.second.find({ "_id.a" : 1}).explain("executionStats")

结果表明它进行了完整的收集扫描。它有没有使用任何索引的原因?似乎复合_id没有复合索引?有没有理由呢?

1 个答案:

答案 0 :(得分:3)

该行为不是特定于复合主键,而是与嵌入文档的索引相关。

Mongo DB区分了使用点表示法和文档查询嵌入字段。

在嵌入文档中为复合主键创建唯一索引。使用点表示法查询文档中的嵌入字段不会使用索引。

db.second.find({ "_id.a" : 1}) -- Doesn't use index

db.second.find({ "_id":{"a" : 1}) -- Uses index

db.second.find({ "_id":{$eq:{"a" : 1}}}) -- Uses index

当您在嵌入字段上创建索引并作为文档查询时,类似规则适用。

db.second.find({ "_id.a" : 1}) -- Uses index

db.second.find({ "_id":{"a" : 1}) -- Doesn't use index

更多信息here& here