假设我的mongo集合中有以下条目:
[{a: 1}, {a: 2}, ... {a: 10}]
现在我想写一个只返回几个项目但又返回总计数的聚合。
如果您编写两个聚合,它们看起来像:
[ // meta info about total number of docs that matched
{ $match: {} },
{ $count: 'totalCount' }
]
[ // get first 5
{ $match: {} },
{ $limit: 5 }
] // totalCount should remain 10
是否可以将其组合成一个聚合以安全一些计算时间?
答案 0 :(得分:1)
您可以使用$facet
,它会遍历文档
db.ad.aggregate(
[
{
$facet : {
metaInfo : [
{ $match : { "a" : 1 } },
{ $group : { _id : null, count : {$sum : 1} } }
],
actualData : [
{ $match : { "a" : 1 } },
{ $limit : 2 }
]
}
}
]
)
收集(有5个)
> db.ad.find()
{ "_id" : ObjectId("5a6a0f4076b4f3c119a8c751"), "a" : 1 }
{ "_id" : ObjectId("5a6a0f4076b4f3c119a8c752"), "a" : 2 }
{ "_id" : ObjectId("5a6a0f4076b4f3c119a8c753"), "a" : 1 }
{ "_id" : ObjectId("5a6a0f4076b4f3c119a8c754"), "a" : 4 }
{ "_id" : ObjectId("5a6a0f4076b4f3c119a8c755"), "a" : 1 }
{ "_id" : ObjectId("5a6a0f4076b4f3c119a8c756"), "a" : 6 }
{ "_id" : ObjectId("5a6a0f4076b4f3c119a8c757"), "a" : 1 }
{ "_id" : ObjectId("5a6a0f4076b4f3c119a8c758"), "a" : 8 }
{ "_id" : ObjectId("5a6a0f4076b4f3c119a8c759"), "a" : 1 }
{ "_id" : ObjectId("5a6a0f4076b4f3c119a8c75a"), "a" : 10 }
>
管道返回元数据和实际数据,meta包含所有匹配计数,实际数据已应用$limit
{
"metaInfo" : [
{
"_id" : null,
"count" : 5
}
],
"actualData" : [
{
"_id" : ObjectId("5a6a0f4076b4f3c119a8c751"),
"a" : 1
},
{
"_id" : ObjectId("5a6a0f4076b4f3c119a8c753"),
"a" : 1
}
]
}
>