MongoDB聚合查询实现公共字段投影与数值求和返回嵌套结果
MongoDB 自定义字段聚合查询实现
实现思路
- 管道首阶段固定使用
$match完成文档过滤,过滤条件支持自定义配置 - 通过
$facet拆分两个并行子管道,分别处理公共字段投影、数值字段求和两类逻辑,仅需一次集合扫描即可完成计算 - 最后调整输出结构,匹配要求的嵌套返回格式
可直接运行的聚合代码
db.你的业务集合名.aggregate([ // 管道第一阶段:$match 文档匹配过滤,可自定义查询条件 { $match: { // 示例过滤规则,可根据业务需求替换,比如按时间范围、运营线路、机构id筛选 bus: "EXAMP", city: "Kanpur" } }, // 拆分两路并行计算两类结果 { $facet: { // 第一路:处理result数组,投影返回指定公共字段 result: [ { $project: { _id: 0, // 不需要返回_id字段可保留该行,需要则删除 bus: 1, city: 1, AccountName: 1, agencyName: 1, depotName: 1 } }, // 匹配范围内公共字段值一致,仅取1条即可,返回长度为1的符合要求的数组 { $limit: 1 } ], // 第二路:处理aggregates对象,对指定数值字段做sum求和 aggregates: [ { $group: { _id: null, CashCollection: { $sum: "$CashCollection" }, Collection: { $sum: "$Collection" }, IssueTicket: { $sum: "$IssueTicket" }, PassengerCount: { $sum: "$PassengerCount" }, TicketCount: { $sum: "$TicketCount" } } }, { $project: { _id: 0 } } ] } }, // 调整最终输出结构,把aggregates从数组转为顶层键值对对象 { $project: { _id: 0, result: 1, aggregates: { $first: "$aggregates" } } } ])
自定义配置方法
- 过滤规则调整:直接修改第一阶段
$match内的查询条件,语法和普通MongoDB查询完全一致 - 公共字段调整:修改
result子管道$project阶段的字段配置,需要返回的字段设置值为1即可 - 求和字段调整:修改
aggregates子管道$group阶段的配置,新增/删除求和字段时,遵循字段名: { $sum: "$字段名" }格式即可
返回结果示例
{ "result": [ { "bus": "EXAMP", "city": "Kanpur", "AccountName": "Examp Transport Service", "agencyName": "BBS", "depotName": "RAYAPUR HUBLI" } ], "aggregates": { "CashCollection": 18, "Collection": 50, "IssueTicket": 12, "PassengerCount": 9, "TicketCount": 8 } }
内容的提问来源于stack exchange,提问作者Roomi
相关产品推荐
相关产品推荐

