如何有效地计算MongoDB $ group运算符中的筛选文档

时间:2016-09-16 15:18:45

标签: mongodb mongodb-aggregation

我有一个相当小的63k文件数据集(总共2.5GB)。文件示例:

{
     _id : "[uniqueId]",
     FormId : 10,
     Name : "Name of form",
     IsComplete : true,
     Sections : [ many sections and can be large ]
}

我希望通过FormId获取文档总数。我在这个查询上获得了快速结果(.15秒):

db.getCollection('collection').aggregate([
     { $sort : { FormId : 1 } }, //Index exists on FormId
     { $group : { _id : "$FormId", count : { $sum : 1 } } },
     { $sort : { "count" : -1 } }
])

我的问题是我需要计算{" IsComplete":true}的文件。我有两个属性构建的索引,但我意识到使用$ match运算符扫描所有文档。那么如何有效地过滤$ group计数?

1 个答案:

答案 0 :(得分:0)

高效的方式将是

使用$ match过滤文档,仅将匹配的文档传递给下一个管道。通过在管道的最开头放置$ match,查询可以利用索引。

使用$ project将只包含必填字段的文档传递到管道中的下一个阶段,这将进一步减少数据到下一个管道。

db.getCollection('collection').aggregate([ 
  { $match: {"IsComplete":true} },
  { $project: {"IsComplete":1, "FormId":1}},
  { $group : { _id : "$FormId", count : { $sum : 1 } } },
  { $sort : { "count" : -1 } }
])