我正在使用以下聚合,并希望了解推荐的索引:
{
"$match" :
{
user : ObjectId(user_id),
type : 'item'
}
},
{ "$group" : {
_id : "$user",
size : { "$sum" : "$size" }
}
}
对用户和类型执行复合索引是否过多或必要,然后是_id和size上的另一个复合索引?
答案 0 :(得分:2)
您无法创建一个按照您描述的方式工作的索引。在运行聚合时,没有办法“索引”管道步骤的一个输出。
有一些聚合运算符can work with MongoDB collection indexes。
目前,它们包括:$match
,$sort
,$limit
和$skip
。
由于$match
就是其中之一,所以您编写的聚合查询的性能可能会通过在两个字段上声明复合索引而受益,尤其是当您正确放置$match
时管道的开头:
db.theCollection.ensureIndex({user: 1, type: 1})
管道中的$group
步骤将获取$match
的结果,理想情况下,相对较快。 :)
答案 1 :(得分:1)
虽然用户和类型的复合索引可能会有所帮助,但_id和size的索引绝对是不必要的。您必须将索引放在您计划搜索的字段上。在这里,您要搜索字段用户和类型,然后将您在其他字段中找到的内容分组。
不要忘记使用explain检查索引是否正常运行。