来自MongoDB docs:
尽可能早地将$ match放在聚合管道中。由于$ match限制了聚合管道中的文档总数,因此早期的$ match操作可以最大限度地减少管道的处理量。
如果在管道的最开头放置$ match,则查询可以利用任何其他db.collection.find()或db.collection.findOne()等索引。
给出查询
db.articles.aggregate( [
{ $match : {date : {$gt: now, $lte: later } } },
{ $match : { score : { $gt : 70, $lte : 90 } } },
{ $group: { _id: null, count: { $sum: 1 } } }
] );
其中(当然),现在和以后代表格式正确的日期,
聚合框架是否会使用第二个匹配的索引(如果可用),或者只是有资格使用索引的聚合管道中的第一个匹配。
查询是否会更好地执行:
db.articles.aggregate( [
{ $match : {date : {$gt: now, $lte: later }, score : { $gt : 70, $lte : 90 } } },
{ $group: { _id: null, count: { $sum: 1 } } }
] );
假设存在涵盖日期和分数的索引?
答案 0 :(得分:3)
不,MongoDB(截至v2.4.6)将仅使用管道中第一个$match
的索引。
对于您发布的第二个聚合查询,只要您在日期和分数上有复合索引,该索引就会用于查询。这应该比您的第一个查询更好。