MongoDB聚合查询:计算带数量权重的平均单价
MongoDB 实现带购买数量权重的平均单价计算
要实现带购买数量权重的平均单价,核心逻辑是计算总花费金额除以总购买数量,而非直接对单价取算术平均。以下是修改后的聚合代码及说明:
修改后的聚合查询代码
const res = await Log.aggregate([ // 过滤目标用户的购买记录 { $match: { user: new ObjectId('653c3906012fec5ace3e54e2'), type: 'buy' } }, // 按商品分组,计算总购买数量和总花费金额 { $group: { _id: '$item', totalAmount: { $sum: '$amount' }, totalCost: { $sum: { $multiply: ['$amount', '$priceEach'] } } } }, // 计算加权平均单价 { $project: { _id: 1, totalAmount: 1, weightedAvgPrice: { $divide: ['$totalCost', '$totalAmount'] } } } ])
关键逻辑说明
- $group阶段:
totalAmount:累加每个商品的总购买数量,对应示例中item384的2+3=5totalCost:通过$multiply计算单条记录的花费(数量×单价),再累加得到总花费,对应示例中2×70000 + 3×50000 = 290000
- $project阶段:
- 用
$divide将总花费除以总数量,得到加权平均单价,对应示例中290000÷5=58000,这就是符合需求的真实平均采购成本
- 用
原代码的$avg: '$priceEach'仅取所有单价的算术平均(示例中(70000+50000)/2=60000),未考虑购买数量权重,无法反映实际采购的平均成本。
内容的提问来源于stack exchange,提问作者OliverKhl
相关产品推荐
相关产品推荐

