对mongodb执行aggregate操作命令得到结果集,前端页面展示时有时需要做分页这类场景,需要获得结果集的总数。将整个结果集都查询出来往往需要耗费很大网络io和内存。本文介绍一种方法返回经aggregate处理后结果集的记录总数。
对3.4之前的mongodb版本,aggregate的stages并没有提供$count算子返回结果集记录数,可通过如下方式获得,对一个结果集记录中存在的key或者不存在的key进行分组,命令示例如下:
db.getCollection('DeteriorationOsgi').aggregate(
[
{
"$match":{
"_id.date":{
"$gte":20191001,
"$lte":20200220
}
}
},
{
"$group":{
"_id":"$_id.deviceId",
"account":{
"$last":"$PPPOEUser"
},
"number":{
"$sum":1
}
}
}
,{ $group: { _id: null, count: { $sum: 1 } } } //分组的_id为null,对于spring data mongodb之类客户端可能不支持记录不存在的key,可以使用_id,注意这里的_id是上一个group自动生成的_id,写法参考{ $group: { _id: _id, count: { $sum: 1 } } }
],
{'allowDiskUse':true}
);
对于3.4以后的版本aggregate在stages阶段提供$count
算子,命令示例如下:
db.getCollection('DeteriorationOsgi').aggregate(
[
{
"$match":{
"_id.date":{
"$gte":20191001,
"$lte":20200220
}
}
},
{
"$group":{
"_id":"$_id.deviceId",
"areacode":{
"$last":"$areacode"
},
"number":{
"$sum":1
}
}
},
{ "$count": "total" }
],
{'allowDiskUse':true}
);