mongodb 使用更新聚合在数组中更新/更新插入数组?

1cosmwyk  于 2023-10-16  发布在  Go
关注(0)|答案(2)|浏览(133)

我有一个收藏包含这样的文件:

{
    "category":"A",
    "list": [
      {
        "item": 1,
        "sub_list": [ 11 ]
      },
      {
        "item": 2,
        "sub_list": [13, 43]
      },
    ],
  }

在给定categoryitem的情况下,如何将一个数字添加到sub_list?如果它不存在,则插入并创建

db.collection.update({
  "category": "A", // "B" will create/upsert new document
  "list.item": 1 // 2 will add new obj to list
},
 ???
{
  upsert: true
})
mlmc2os5

mlmc2os51#

想办法解决。
有类似Umer Abbas的评论。

db.collection.update({
  "category": "A"
},
[
  {
    "$set": {
      "list": {
        "$cond": {
          if: {
            $in: [
              1,
              {
                "$ifNull": [
                  "$list.item",
                  []
                ]
              }
            ]
          },
          then: {
            $map: {
              input: "$list",
              in: {
                $cond: {
                  if: {
                    $and: [
                      {
                        $eq: [
                          "$$this.item",
                          1
                        ]
                      },
                      {
                        $not: {
                          $in: [
                            11,
                            {
                              "$ifNull": [
                                "$$this.sub_list",
                                []
                              ]
                            }
                          ]
                        }
                      }
                    ]
                  },
                  then: {
                    $mergeObjects: [
                      "$$this",
                      {
                        "sub_list": {
                          "$concatArrays": [
                            {
                              "$ifNull": [
                                "$$this.sub_list",
                                []
                              ]
                            },
                            [
                              11
                            ]
                          ]
                        }
                      }
                    ]
                  },
                  else: "$$this"
                }
              }
            }
          },
          else: {
            "$concatArrays": [
              [
                {
                  "item": 1,
                  "sub_list": [
                    11
                  ]
                }
              ],
              {
                $ifNull: [
                  "$list",
                  []
                ]
              }
            ]
          }
        }
      }
    }
  }
],
{
  "upsert": true
})

你可以在mongoplayground上试试。
编辑的答案

const categoryVal = "A"
const itemToFind = 1
const valToAdd = 68
db.collection.update({
  "category": categoryVal
},
[
  {
    "$set": {
      "list": {
        "$cond": {
          if: {
            $in: [
              itemToFind,
              {
                "$ifNull": [
                  "$list.item",
                  []
                ]
              }
            ]
          },
          then: {
            $map: {
              input: "$list",
              in: {
                $cond: {
                  if: {
                    $and: [
                      {
                        $eq: [
                          "$$this.item",
                          itemToFind
                        ]
                      },
                      {
                        $not: {
                          $in: [
                            valToAdd,
                            {
                              "$ifNull": [
                                "$$this.sub_list",
                                []
                              ]
                            }
                          ]
                        }
                      }
                    ]
                  },
                  then: {
                    $mergeObjects: [
                      "$$this",
                      {
                        "sub_list": {
                          "$concatArrays": [
                            {
                              "$ifNull": [
                                "$$this.sub_list",
                                []
                              ]
                            },
                            [
                              valToAdd
                            ]
                          ]
                        }
                      }
                    ]
                  },
                  else: "$$this"
                }
              }
            }
          },
          else: {
            "$concatArrays": [
              [
                {
                  "item": itemToFind,
                  "sub_list": [
                    valToAdd
                  ]
                }
              ],
              {
                $ifNull: [
                  "$list",
                  []
                ]
              }
            ]
          }
        }
      }
    }
  }
],
{
  "upsert": true
})
xqkwcwgp

xqkwcwgp2#

要将一个数字推送到sub_list,我们需要执行以下操作:

db.collection.update(
  {
    "category": "A", 
    "list.item": 1   
  },
  {
    "$push": {"list.$.sub_list": 4} // 4 will be added to sub_list
  },
  {
    upsert: true
  }
);

相关问题