mongodb 有条件更新

mongodb update with conditions

我的订单集合为

[
  {
    _id:'134',
    items:[
        {
            _id:'itemId1'   
            quantity: 2,
            price: 100,,
            couponsApplied:[]
        },
        {
            _id:'itemId2'   
            quantity: 2,
            price: 200,,
            couponsApplied:[]
        }
    ]
   } 
 ]

我想为以上每件商品申请 5% 的折扣。即开 item _id:'itemId1', 我要推送 我要推送到优惠券应用为

{
    couponAmount: 10, // quantity*price*percentage/100. which is 2*100*5/100 
}

& 同样在_id:'itemId2', 我想推送优惠券应用为

{
    couponAmount: 20, 
}

所以,在更新操作之后它应该看起来像

[
  {
    _id:'134',
    items:[
        {
            _id:'itemId1'   
            quantity: 2,
            price: 100,,
            couponsApplied:[
             {
              _id:'100',
              couponAmount: 10
              }               
            ]
        },
        {
            _id:'itemId2'   
            quantity: 2,
            price: 200,,
            couponsApplied:[
              {
               _id:'1002'
               couponAmount: 20, 
              }
            ]
        }
    ]
   } 
 ]

我已经尝试使用 $mul 和 $sum 进行聚合更新,但没有成功 请帮忙!

有点长的更新查询。

  1. $set - 更新 items 数组字段。

    1.1。 $map - 使用 items 数组和 returns 数组进行迭代。

    1.1.1。 $mergeObjects - 将当前对象与 couponsApplied 数组字段合并。

    1.1.1.1。 $concatArrays - 将 couponsApplied 数组与 1.1.1.1.1.

    的结果合并

    1.1.1.1.1。包含新文档的数组包含 couponAmount 字段。

db.collection.update({},
[
  {
    $set: {
      "items": {
        $map: {
          input: "$items",
          in: {
            $mergeObjects: [
              "$$this",
              {
                couponsApplied: {
                  $concatArrays: [
                    "$$this.couponsApplied",
                    [
                      {
                        couponAmount: {
                          $multiply: [
                            "$$this.price",
                            "$$this.quantity",
                            {
                              $divide: [
                                5,
                                100
                              ]
                            }
                          ]
                        }
                      }
                    ]
                  ]
                }
              }
            ]
          }
        }
      }
    }
  }
])

Sample Mongo Playground

试试这个:

db.collection.update({},
[
  {
    "$set": {
      "items": {
        $map: {
          input: "$items",
          as: "item",
          in: {
            _id: "$$item._id",
            quantity: "$$item.quantity",
            price: "$$item.price",
            couponsApplied: {
              $concatArrays: [
                "$$item.couponsApplied",
                [
                  {
                    couponAmount: {
                      $divide: [
                        {
                          $multiply: [
                            "$$item.quantity",
                            "$$item.price",
                            5
                          ]
                        },
                        100
                      ]
                    }
                  }
                ]
              ]
            }
          }
        }
      }
    }
  }
])