MongoDB中如何对两个集合的costPrice求和并按商品总价值排序
MongoDB跨集合产品成本统计实现方案
默认两个集合名称为coll1(对应你说的集合1)、coll2(对应你说的集合2),可根据实际集合名修改后直接运行聚合查询:
db.coll1.aggregate([ // 打平集合1的products内嵌数组 { $unwind: "$products" }, // 按产品ID分组统计集合1内的总成本价 { $group: { _id: "$products._id", name: { $first: "$products.name" }, totalCollection1: { $sum: "$products.pricePolicy.costPrice" } } }, // 合并集合2的统计结果 { $unionWith: { coll: "coll2", pipeline: [ // 打平集合2的listProduct内嵌数组 { $unwind: "$listProduct" }, // 按产品ID分组统计集合2内的总成本价 { $group: { _id: "$listProduct.id", name: { $first: "$listProduct.name" }, totalCollection2: { $sum: "$listProduct.costPrice" } } } ] } }, // 合并同一产品在两个集合的统计值,缺省值补0 { $group: { _id: "$_id", name: { $first: "$name" }, totalCollection1: { $sum: { $ifNull: ["$totalCollection1", 0] } }, totalCollection2: { $sum: { $ifNull: ["$totalCollection2", 0] } } } }, // 计算单个产品的总成本价总和 { $addFields: { total: { $add: ["$totalCollection1", "$totalCollection2"] } } }, // 按总成本价降序排序 { $sort: { total: -1 } } ])
查询逻辑说明:
$unwind用于拆解内嵌的产品数组,将每个产品转化为独立的单条记录方便统计- 两次分组操作分别计算两个集合中每个产品的成本价总和,分别存入对应字段避免混淆
$unionWith用于直接合并两个集合的统计结果,不需要分两次查询后手动拼接数据- 最终分组处理将同一产品在两个集合的统计值合并,没有对应统计值的字段默认补0,计算总价值后按要求排序即可得到你需要的结果格式。
内容的提问来源于stack exchange,提问作者Cuong TQ
相关产品推荐
相关产品推荐

