MongoDB如何基于关联集合在数据库端直接计算订单折扣后总价
解决方案
你只需要在现有聚合管道后追加$group、$addFields两个阶段即可,完整聚合查询代码如下:
const data = await db.order.aggregate([ { "$match": { "orderId": orderId } }, { "$lookup": { "from": "item", let: { eid: "$itemId" }, pipeline: [ { "$match": { $expr: { $in: [ "$_id", "$$eid" ] } } }, ], "as": "items" } }, { "$unwind": { path: "$items" } }, // 新增:按订单分组,求和所有商品价格,同时保留订单折扣字段 { "$group": { "_id": "$_id", "totalPrice": { $sum: "$items.Price" }, "discount": { $first: "$Discount" } } }, // 新增:计算折扣后最终总价 { "$addFields": { "finalTotal": { $subtract: ["$totalPrice", "$discount"] } } }, // 可选:只返回你需要的最终总价字段 { "$project": { "_id": 0, "finalTotal": 1 } } ])
新增阶段说明
$group阶段:你前面通过$unwind把同个订单的多个商品拆成了多条独立记录,这一步按订单主键分组,用$sum累加所有关联商品的价格,同时用$first取当前订单的折扣值(同个订单的折扣是固定的,取第一条记录的折扣即可)$addFields阶段:直接用MongoDB内置的$subtract算术算子完成「商品总价扣减订单折扣」的计算,得到最终应付金额- 可选的
$project阶段:过滤掉所有无关字段,直接返回最终总价,调用时只需取data[0].finalTotal即可拿到示例中的100.21结果
内容的提问来源于stack exchange,提问作者Sushant Rad
相关产品推荐
相关产品推荐

