【问题标题】:Calculate total price based on referenced collection根据引用的集合计算总价
【发布时间】:2021-11-28 02:19:13
【问题描述】:

假设我在 bookOrder 中有数据:

{
    "_id" : ObjectId("615fc295257d6d7cf57a39fe"),
    "orderId" : "2001",
    "itemId" : [ 
        "615fc232257d6d7cf57a39d4", 
        "615fc251257d6d7cf57a39e0"
    ],
    "Discount" : 10
}

项目数据为:

{
    "_id" : ObjectId("615fc232257d6d7cf57a39d4"),
    "itemId" : "1001",
    "Price" : 10.21
} 

{
    "_id" : ObjectId("615fc251257d6d7cf57a39e0"),
    "itemId" : "1002",
    "Price" : 100
}

我想计算折扣后订单的总价,

即总价为:100+10.21-10 = 100.21

为此,我尝试如下:

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"
                }
            },
        ]
    )

所以,我得到的值是:

{
    "orderId" : "2001",
    "Discount":10,
    "itemId":[{
        "itemId" : "1001",
        "Price" : 10.21
    },
        "itemId" : "1002",
        "Price" : 100
    ]}
}

因此,我们不必遍历 itemId 价格并获得总太阳,然后从订单的折扣价格中减去,我们可以对 db 本身进行所有这些计算。

有什么方法可以让我只从数据库中查询总价,而不必获取数据并应用任何循环然后计算总价?

如果有人需要我的进一步解释,请告诉我。

【问题讨论】:

  • 显然需要解释 ????你的问题几乎没有解释。也许更多一点?如果有任何错误信息,您也可以输入。
  • 哈哈....是的,我已经用我得到的 O/P 和我的期望编辑了这个问题,希望现在有意义。

标签: javascript node.js mongodb mongoose


【解决方案1】:

使用sum

聚合

db.orders.aggregate([
  {
    "$match": {
      "orderId": "2001"
    }
  },
  {
    "$lookup": {
      "from": "items",
      "localField": "itemId",
      "foreignField": "_id",
      "as": "items"
    }
  },
  {
    "$project": {
      "orderId": 1,
      "total": {
        $subtract: [
          {
            "$sum": "$items.Price"
          },
          "$Discount"
        ]
      }
    }
  }
])

mongoplayground

【讨论】:

  • 非常感谢您的帮助。我还有一个查询,我能不能也得到项目的所有对象。
【解决方案2】:

您可以通过多种方式做到这一点,这是使用$map 和一些数学运算符的最直接的方式。

db.order.aggregate([
  {
    "$match": {
      "orderId": "2001"
    }
  },
  {
    "$lookup": {
      "from": "item",
      let: {
        eid: "$itemId"
      },
      pipeline: [
        {
          "$match": {
            $expr: {
              $in: [
                "$_id",
                "$$eid"
              ]
            }
          }
        },
        
      ],
      "as": "items"
    }
  },
  {
    $project: {
      orderId: 1,
      finalSum: {
        $subtract: [
          {
            $sum: {
              $map: {
                input: "$items",
                in: "$$this.Price"
              }
            }
          },
          "$Discount"
        ]
      }
    }
  }
])

Mongo Playground

【讨论】:

    猜你喜欢
    • 2021-09-19
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多