0

来自 MongoDB文档

尽可能早地将 $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 } } }
                   ] );

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

4

1 回答 1

3

不,MongoDB(从 v2.4.6 开始)只会$match在管道中的第一个上使用索引。

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

于 2013-09-18T19:56:27.543 回答