You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 14:15:02