【问题标题】:How do I update multiple documents in MongoDB with non similar update criteria in one command?如何在一个命令中使用不相似的更新条件更新 MongoDB 中的多个文档?
【发布时间】:2016-09-28 13:46:31
【问题描述】:

假设我们对所有员工进行了加薪,其中加薪并非对所有人都是固定的,并且取决于同一员工文档中的某些字段,我如何将所有工资更新到 mongo 文档(每个员工一个) 一个命令?

更新

假设我有员工 id 或姓名,以及薪水升级,并想用一个命令更新所有文档

示例文档

{ _id:“11111”, 工资:(metric_1/metric_2), 名称:“安德鲁”, metric_1:12345, metric_2:222,
... }

{ _id:“22222”, 工资:(metric_1/metric_2), 名称:“约翰”, metric_1:999, 公制_2:223, ... }

其中 metric_1 和 metric_2 是与用户交互相关的随机因素,而薪水是它们的函数。

【问题讨论】:

  • 有很多方法可以进行此类更新。但是,为了获得明确的解决方案,请更新您的帖子以及一些示例文档结构。参考请见stackoverflow.com/help/mcve
  • @Saleem,感谢您的评论。帖子已更新。
  • 什么是增值标准。工资100怎么涨到300?有什么数学公式吗?任何百分比?
  • 改了帖子里的更新,请查收

标签: javascript mongodb


【解决方案1】:

下面的命令很好用,可以根据需要执行所需的操作,考虑到您有一个要更新的用户 id 或名称列表(可能是全部)

db.salaries.aggregate( [ {$match : { _id:{$in:[ObjectId("563e1d9d04aa90562201fd5f"),ObjectId("564657f88f71450300e1fe0b")]}  } } , {$project: { rating: {$divide:["$metric_1","$metric_2"]} } } , {$out:"new_salaries"} ] )

上述命令的缺点是你必须有一个新的集合来插入新的更新字段,如果命名现有的集合(在这种情况下是薪水),它将删除所有现有的字段,只添加新的计算文档,这是不安全的,因为在新的工资计算过程中可能发生了其他操作。

更好的方法

更好的做法是将聚合流水线与 mongo 的批量操作结合起来,对我们现有的集合进行批量更新。这样:

var salaries_to_update = db.salaries.aggregate( [ {$match : { _id:{$in:[ObjectId("563e1d9d04aa90562201fd5f"),ObjectId("564657f88f71450300e1fe0b")]}  } } , {$project: { rating: {$divide:["$metric_1","$metric_2"]} } } ] )

然后我们进行批量更新操作,一次进行批量更新,无需大量处理和来回流量问题。

var bulk = db.salaries.initializeUnorderedBulkOp()

salaries_to_update.forEach(salary){
    bulk.find( _id: salary._id).updateOne({$set:{salary:salary.salary}})
}

bulk.execute()

有序批量操作按顺序执行(因此得名), 出现错误时停止。

无序批量操作被执行 没有特定的顺序(可能是并行的)和这些操作 发生错误时不要停止。

因此,我们在这里使用无序批量更新。

就是这样

【讨论】:

    猜你喜欢
    • 2010-12-16
    • 2020-03-18
    • 1970-01-01
    • 2019-10-13
    • 2019-02-21
    • 2019-05-22
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    相关资源
    最近更新 更多