考虑一个集合
{ "_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没有复合索引?有没有理由呢?
答案 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