我有一个相当小的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计数?
答案 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 } }
])