mongodb 使用mongoose更新数组中的元素

wgeznvg7  于 2022-11-22  发布在  Go
关注(0)|答案(1)|浏览(308)

我有一个数组,其中有多个对象(可以有两个以上)。现在我需要更新对象中的一个元素(change verified to true)(例如,一个method =“app”的对象)。如果该对象还不存在,则需要重新创建它。有没有办法用Mongoose处理这个问题?

我找到了更新的解决方案,但在没有对象存在的情况下无法解决问题

const result = await User.updateOne({email},
    { $set: { "multifactors.$[elem].verified" : true } },
    { arrayFilters: [ { "elem.method": "app" } ] }
)
iqjalb3h

iqjalb3h1#

这是一种方法,使用流水线更新。
a.使用$filter和$size检查数组是否包含所需的对象。
B.如果存在,则更新匹配的object $map。
c.否则,将新对象附加至数组。

db.collection.update({},
[
  {
    "$set": {
      "multifactors": {
        $cond: {
          if: {
            $gt: [
              {
                $size: {
                  $filter: {
                    input: "$multifactors",
                    as: "factor",
                    cond: {
                      $eq: [
                        "$$factor.method",
                        "app"
                      ]
                    }
                  }
                }
              },
              0
            ]
          },
          then: {
            $map: {
              input: "$multifactors",
              as: "factor",
              in: {
                $cond: {
                  if: {
                    $eq: [
                      "$$factor.method",
                      "app"
                    ]
                  },
                  then: {
                    $mergeObjects: [
                      "$$factor",
                      {
                        verified: true
                      }
                    ]
                  },
                  else: "$$factor"
                }
              }
            }
          },
          else: {
            $concatArrays: [
              "$multifactors",
              [
                {
                  method: "app",
                  verified: true
                }
              ]
            ]
          }
        }
      }
    }
  }
])

Playground link.

相关问题