MongoDB聚合查询:返回匹配文档明细及指定字段求和结果
MongoDB 聚合查询实现
你可以直接使用如下聚合管道实现需求,核心通过$facet阶段同时完成明细筛选和全局汇总计算,不需要多次扫描集合:
db.你的实际集合名.aggregate([ // 第一阶段:条件过滤,按实际业务替换匹配规则即可 { $match: { // 此处填写你的过滤规则,示例:按时间、城市筛选 // createTime: { $gte: ISODate("2024-01-01T00:00:00Z") }, // city: "Udaypur" } }, // 并行执行两个独立聚合分支 { $facet: { // 分支1:生成result数组,仅保留要求的公共字段 result: [ { $project: { _id: 1, bus: 1, city: 1, AccountName: 1, agencyName: 1, depotName: 1 } } ], // 分支2:计算指定数值字段的全局总和 aggregates: [ { $group: { _id: null, CashCollection: { $sum: "$CashCollection" }, Collection: { $sum: "$Collection" }, IssueTicket: { $sum: "$IssueTicket" }, PassengerCount: { $sum: "$PassengerCount" }, TicketCount: { $sum: "$TicketCount" } } }, // 移除group阶段自动生成的_id字段 { $project: { _id: 0 } } ] } }, // 把aggregates从长度为1的数组转为单个对象,匹配预期结构 { $addFields: { aggregates: { $arrayElemAt: ["$aggregates", 0] } } } ])
管道阶段说明
$match:作为第一阶段执行可以命中集合索引,大幅提升查询效率,过滤规则根据实际业务调整即可$facet:单次查询同时完成明细提取和汇总计算,避免两次查询重复扫描集合数据- 最终结构调整阶段:把汇总分支返回的数组格式转为对象格式,和预期返回结构完全对齐
返回效果
执行后返回的结果和你给出的预期结构完全一致:
{ result: [ { _id: "6284b519313f50001595fe37", "bus": "EXAMP", "city": "Udaypur", "AccountName": "Examp Transport Service", "agencyName": "Sbb", "depotName": "RAYAPUR HUBLI" }, { _id: "62684658703e9e00136ec64c", "bus": "EXAMP", "city": "Kanpur", "AccountName": "Example Transport Service", "agencyName": "BBS", "depotName": "RAYAPUR HUBLI" } ], aggregates: { "CashCollection": 18, "Collection": 50, "IssueTicket": 12, "PassengerCount": 9, "TicketCount": 8 } }
注意:生产环境使用时必须在
$match阶段配置合理的过滤条件,禁止无过滤条件查询全表,避免引发数据库性能问题。
内容的提问来源于stack exchange,提问作者Roomi
相关产品推荐
相关产品推荐

