MongoDB聚合中如何将两条带条件的投影查询合并为一个
MongoDB合并聚合查询解决方案
完全可以将两条查询合并为单条实现相同效果,推荐使用MongoDB的$facet聚合阶段,它支持在同一次查询中并行执行多个独立的子聚合管道,无需两次请求数据库。
合并后的查询代码
Orders.aggregate([ // 先过滤出只需要统计的两类配送订单,缩小后续处理数据集 { $match: { shippingType: { $in: ["standardShipping", "expressShipping"] } } }, // 并行执行两个子管道分别统计两类配送的商品数量 { $facet: { // 子管道1:对应原标准配送查询逻辑 standardShippingStats: [ { $match: { shippingType: "standardShipping" } }, { $project: { standardShippingCount: { $size: "$products" } } } ], // 子管道2:对应原加急配送查询逻辑 expressShippingStats: [ { $match: { shippingType: "expressShipping" } }, { $project: { expressShippingCount: { $size: "$products" } } } ] } } ])
结果说明
查询返回的结果仅包含1条文档,两个字段分别对应原两次查询的返回结果:
standardShippingStats:和原第一条标准配送查询的返回结构完全一致expressShippingStats:和原第二条加急配送查询的返回结构完全一致
如果你的实际需求是统计所有标准/加急配送的商品总数量,而非单个订单对应的商品数,可以在对应子管道的$project后新增$group阶段求和即可,示例如下:
// 统计标准配送总商品数示例,放在standardShippingStats子管道末尾 { $group: { _id: null, totalStandardCount: { $sum: "$standardShippingCount" } } }
内容的提问来源于stack exchange,提问作者ertemishakk
相关产品推荐
相关产品推荐

