如何在MongoDB聚合查询中同时获取总记录数与全部数据
同时获取聚合结果和总记录数的解决方案
我懂你的需求啦——现在你的聚合查询已经能拉到符合条件的路灯数据,但想一次查询就搞定数据列表+总记录数,不用跑两次查询对吧?MongoDB的$facet阶段正好能解决这个问题,它允许你在同一个聚合管道里并行执行多个子管道,完美满足你的需求。
修改后的完整查询语句
db.STREETLIGHTS.aggregate([ // 保留你原来的匹配条件 {$match : {"CreateDate":{$gt: new Date(ISODate("2018-04-09T23:54:16.064Z") - 24*60*60 * 1000)}}}, // 使用$facet拆分两个任务:拿数据、统计总数 {$facet: { // 第一个子管道:获取所有符合条件的记录(和你原来的查询逻辑一致) "data": [ { $project: {_id:1, SLC_ID:1,LONGITUDE:1,LATITUDE:1,DCUID:1,CUMILITIVE_KWH:1,LAMPSTATUS:1,CreateDate:1 } } // 如果需要分页,在这里加上$skip和$limit就行,比如: // {$skip: 0}, // {$limit: 10} ], // 第二个子管道:统计总记录数 "totalCount": [ {$count: "count"} ] }} ])
结果说明
返回的结果会是一个包含两个字段的文档:
data:数组,里面就是你原来查询想要的所有路灯记录;totalCount:数组,里面只有一个对象,count字段的值就是符合$match条件的总记录数(比如[{"count": 123}])。
为什么这么做?
相比分开跑两次查询(一次查数据、一次count),用$facet的优势是只需要一次数据库请求,既减少了网络开销,也能保证数据的一致性(避免两次查询之间数据发生变化)。
内容的提问来源于stack exchange,提问作者VARUN
相关产品推荐
相关产品推荐

