【问题标题】:Mongoose Updating an array in multiple documents by passing an array of filters to update queryMongoose 通过传递过滤器数组来更新多个文档中的数组以更新查询
【发布时间】:2020-05-15 05:56:55
【问题描述】:

我在一个集合中有多个文档(本例中为 3 个文档),如下所示:

{
   _id:123,
   bizs:[{_id:'',name:'a'},{_id:'',name:'b'}]
},

{
  _id:456,
  bizs:[{_id:'',name:'e'},{_id:'',name:'f'}]
}

{
  _id:789,
  bizs:[{_id:'',name:'x'},{_id:'',name:'y'}]
}

现在,我想通过匹配我的 id 数组来更新 bizs 子文档。 也就是说,我的更新查询的数组过滤器是[123,789],它会匹配每个文档的_id字段。 我曾尝试使用 findByIdAndUpdate() 但这不允许更新查询的数组

如何更新 2 个匹配的文档(如我上面的示例),而不必将 findByIdAndUpdate 放在 forloop 中以将数组元素与 _id 匹配?

【问题讨论】:

  • 这两个文档的更新值是否相同,或者每个文档的更新值不同?
  • @srinivasy 这两个文档的更新值相同

标签: mongodb mongoose mongodb-query


【解决方案1】:

更新多个文档时不能使用findByIdAndUpdatefindByIdAndUpdate 来自 mongoose,它是原生 MongoDB 的findOneAndUpdate 的包装器。当您将单个字符串作为过滤器传递给findByIdAndUpdate 时,例如:Collection.findByIdAndUpdate({'5e179dac627ef7823643cd97'}, {}) - 然后猫鼬将在内部将string 转换为ObjectId() 并将其形成为过滤器,例如:_id : ObjectId('5e179dac627ef7823643cd97') 以执行findOneAndUpdate。所以这意味着您一次只能更新一个文档,因此如果您有多个文档要更新,请使用update 选项{multi : true}updateMany

假设你想将一个新对象推送到bizs,这就是查询的样子:

collection.updateMany({ _id: { $in: [123, 456] } }, {
    $push: {
        bizs: {
            "_id": "",
            "name": "new"
        }
    }
})

注意:更新操作不会返回文档作为响应,而是返回写入结果,其中包含有关 n 个匹配的文档和 n 个已修改的文档的信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-10
    • 2021-12-26
    • 1970-01-01
    • 2014-12-28
    • 2023-01-24
    • 2014-11-03
    • 2020-12-11
    • 1970-01-01
    相关资源
    最近更新 更多