我有一个具有重复价值的集合,如下所示
{ "_id" : ObjectId("59f42f500790826aae869517"), "student_id" : 1, "type" : "exam", "score" : 38.09994424551998 }
{ "_id" : ObjectId("59f42f500790826aae869518"), "student_id" : 1, "type" : "homework", "score" : 91.98453327244025 }
{ "_id" : ObjectId("59f42f500790826aae869519"), "student_id" : 1, "type" : "quiz", "score" : 51.50397276737756 }
现在我将'student_id'作为索引,并且有
的索引'student_id,输入','student_id,score'& 'student_id数据,类型,得分'
。 当我在这个
下运行查询时db.scores.explain("executionStats").find({'student_id':{$gte:10}},{_id:0,type:0,score:0})
我希望只有'student_id'索引应该被使用,因为所有其他字段都被预测为0所以我不需要它们。但是它告诉我使用的索引是'student_id,输入'。有人猜测我可以认为mongodb会扫描每个文档以查找特定的student_id,以了解文档的区别,最好的方法是使用“student_id,type”INDEX。但是我可能是错的。所以请帮助我知道原因。感谢。
答案 0 :(得分:1)
我刚试验过你的场景,并且可以确认索引创建的顺序似乎是关键。
对此的解释可能是查询优化器只查找覆盖所需字段的索引(在您的情况下仅为student_id
)。因此,这个“找到正确的”索引算法按创建顺序遍历可用索引列表。并且由于它遇到的第一个索引(除了_id
字段上的默认索引...)已经适合您的查询,优化程序决定使用它并且不再费心。
indexes州的文档:
MongoDB索引使用B树数据结构。
复合索引中列出的字段顺序具有重要意义。对于 例如,如果复合索引由{userid:1,得分:-1}组成, 索引首先按用户标识排序,然后在每个用户标识值内排序, 按分数排序。
因此,由于所有索引都以student_id
作为第一个字段,因此所有索引在树的顶部(“在根目录下方”)看起来都相同,并且同样可以很好地为您的查询提供服务。