【问题标题】:Mongoose Update By Passing In Array of Documents通过传入文档数组进行 Mongoose 更新
【发布时间】:2022-01-21 23:52:38
【问题描述】:

类似的功能是否可行:

let Item = mongoose.model('Item')
let updatedItems = [updatedItem1, updatedItem2]
let updatedItemIds = [updatedItem1._id, updatedItem2._id]

Item.updateMany({_id: {$in: updatedItemIds }}, updatedItems) // this wont work

类似于:

updatedItems.forEach( item => {
    Item.updateOne({_id: item._id}, item) 
})

我试图避免多次调用服务器,我知道有一个 bulkWrite 选项,我可以这样做:

bulk = []
updatedItems.forEach( item => { 
  let updateDoc = {
    'updateOne': {
      'filter': { '_id': item._id },
      'update': item,
      'upsert': false
     }
  }  
  bulk.push(updateDoc)
})
Item.collection.bulkWrite(bulk)

但这感觉效率低下,因为它似乎需要加载每个自定义查询,尽管我对后台的 bulkWrite 并不了解。我只是想问一下 bulkWrite 是否是这里唯一的选择。

编辑: 我知道上面的第一个查询不起作用,但它是为了显示我正在寻找什么功能 - 将更新的对象传递给 Mongoose,并使这些对象与它们各自的文档匹配并更新。

【问题讨论】:

    标签: mongodb mongoose mongoose-schema mongoose-web-server


    【解决方案1】:

    您正在使用的查询

    Item.updateMany({_id: {$in: updatedItemIds }}, updatedItems);
    

    它不起作用,因为当你使用updateMany()函数时,第一个参数是filter,你用得很好,但是,第二个参数是update,你没有使用正确的方法。

    为了使用更新,您必须使用以下之一:

      $addFields and its alias $set
        $project and its alias $unset
        $replaceRoot and its alias $replaceWith.
    

    或者,您可以简单地使用,updateMany({filter},{itemsids:passedIds})

    【讨论】:

    • 感谢您提供的信息,但是我在问是否有一种方法可以通过传入对象数组来动态更新。您的示例会将每个文档的字段 itemids 设置为我认为的相同值。我正在尝试模仿我使用 bulkWrite 实现的功能。
    【解决方案2】:

    在撰写本文时,批量写入只是在 Mongoose 中一次动态更新多个文档的唯一方式(一个查询中每个文档的唯一更新)。复杂的 Mongo 聚合也可以在一个查询中完成对每个文档的不同更新,但它的性能会因您在聚合中添加的每个过滤器或条件检查而受到影响。

    我发现批量写入的性能优于多次 Mongoose 更新:

    bulk = []
    updatedItems.forEach( item => { 
      let updateDoc = {
        'updateOne': {
          'filter': { '_id': item._id },
          'update': item,
          'upsert': false
         }
      }  
      bulk.push(updateDoc)
    })
    Item.collection.bulkWrite(bulk)
    
     
    

    【讨论】:

      猜你喜欢
      • 2020-05-15
      • 2012-03-10
      • 2020-06-07
      • 2017-06-27
      • 2014-06-12
      • 2023-03-10
      • 2014-11-03
      • 2016-10-06
      • 1970-01-01
      相关资源
      最近更新 更多