第二个$匹配是否使用索引

时间:2013-08-30 21:14:22

标签: mongodb aggregation-framework

来自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 } } }
                   ] );

假设存在涵盖日期和分数的索引?

1 个答案:

答案 0 :(得分:3)

不,MongoDB(截至v2.4.6)将仅使用管道中第一个$match的索引。

对于您发布的第二个聚合查询,只要您在日期和分数上有复合索引,该索引就会用于查询。这应该比您的第一个查询更好。