我的mongo查询正在使用索引,但如果我使用聚合实现相同的功能,则它不使用索引。
db.collection1.find({Attribute8: "s1000",Attribute9: "s1000"}).sort({Attribute10: 1})
"在find"中使用的光标:" BtreeCursor Attribute8_1_Attribute9_1_Attribute10_1"
db.collection1.aggregate([
{
$match: {
Attribute8: "s1000",
Attribute9: "s1000"
}
},
{
$sort: {
Attribute10: 1
}
}
])
"光标用于聚合" :" BtreeCursor"。
有人可以告诉我哪里出错了。我的目标是在聚合方法中使用索引。 提前谢谢。
答案 0 :(得分:1)
经过一番挖掘后,问题是以下类型的使用限制:
Symbol,MinKey,MaxKey,DBRef,Code和CodeWScope
在这种情况下,Symbol用于包含字符串值,因此索引不起作用。
请在聚合选项中尝试使用Number en set explain to true。
[编辑] 我之前的回答是不正确的。
汇总渠道正在使用' BtreeCursor' (仅当定义的字段具有索引时)才能运行$ match查询并确实使用了确保的索引,请检查" indexBound"用于验证。
确保整个集合在" Attribute08"
上有索引db.temps.ensureIndex({Attribute08:1})
$匹配带索引的字段:
db.temps.aggregate([{$match:{Attribute08:"s1000"}}],{explain:true}) "allPlans" : [ { "cursor" : "BtreeCursor ", "isMultiKey" : false, "scanAndOrder" : false, "indexBounds" : { "Attribute08" : [ [ "s1000", "s1000" ] ] } } ]
在没有索引的字段上的$ match下面:
db.temps.aggregate([{$match:{Attribute09:"s1000"}}],{explain:true}) "allPlans" : [ { "cursor" : "BasicCursor", "isMultiKey" : false, "scanAndOrder" : false } ]