【问题标题】:How to remove object from array in Mongoose using updateMany?如何使用 updateMany 从 Mongoose 的数组中删除对象?
【发布时间】:2021-12-01 11:52:24
【问题描述】:

我正在尝试使用 Mongoose/Node 从 MongoDB 中的数组中删除一个对象,但到目前为止我无法将其删除。我已经阅读了文档和 SO 帖子,但没有运气。我希望有人能给我关于解决方案的具体建议,而不仅仅是指向另一个模糊相关的帖子的链接

Mongo 文档示例

{
  managers: [{
      userID: value,
      // other fields and values
    },
  // Another object for another manager
  ]
}

我正在尝试使用的代码

await Model.updateMany(
  {'managers.userID': userID}, // This should be the query part
  {$pullAll: {'managers': {'userID': userID}}} // This should be the update part
)

【问题讨论】:

    标签: node.js database mongodb mongoose


    【解决方案1】:

    使用$pullAll 你必须匹配整个对象。

    除了查询中的语法不正确之外,请检查this example 中的id 1 是如何未被删除但它是id 2。那是因为$pullAll 期望匹配整个对象。 this other example 可以同时删除 ids

    然后,您可以像这样使用$pull$in 进行查询:

    await Model.updateMany({
      "managers.userID": userID
    },
    {
      "$pull": {
        "managers": {
          "userID": {
            "$in": userIDs
          }
        }
      }
    })
    

    例如here

    注意$in 如何期望一个数组。如果你只想基于一个值删除你可以避免$in

    await Model.updateMany({
      "managers.userID": userID
    },
    {
      "$pull": {
        "managers": {
          "userID": userID
        }
      }
    })
    

    例如here

    【讨论】:

    • 谢谢,所以当我尝试这个时它什么也没做。它似乎在 0 个文档上运行。但是,如果我手动从数据库中复制一个文档并将其插入到操场中,然后修改第二部分中的用户 ID 以匹配我代码中 console.log() 的值,那么它会按预期工作。也许这是由于 update 与 updateMany 的处理方式不同造成的?
    • userIDObjectId 吗?也许您正在尝试将字符串与ObjectId 进行比较。据我所知,UpdateMany 与 multi:true 的 mongo 更新相同。
    • 想通了,你的答案没有错。这是 axios 没有将数据库连接的值正确发送到我的后端的问题。
    猜你喜欢
    • 1970-01-01
    • 2016-03-16
    • 2021-07-27
    • 1970-01-01
    • 2021-10-07
    • 2018-02-26
    • 2016-10-28
    • 2021-09-12
    • 1970-01-01
    相关资源
    最近更新 更多