gpt4 book ai didi

javascript - 如何在一个命令中使用不相似的更新条件更新 MongoDB 中的多个文档?

转载 作者:行者123 更新时间:2023-11-28 05:57:32 24 4
gpt4 key购买 nike

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

更新

假设我有员工 ID 或姓名,以及薪资升级,并且希望用一个命令更新所有文档

示例文档

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

{ _id:“22222”, 工资:(metric_1/metric_2), 姓名:“约翰”, 指标_1:999, 指标_2:223, ...}

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

最佳答案

考虑到您有要更新的用户 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()

Ordered bulk operations are executed in an order (thus the name),halting when there’s an error.

Unordered bulk operations are executedin no particular order (potentially in parallel) and these operationsdo not stop when an error occurs.

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

就这些了

关于javascript - 如何在一个命令中使用不相似的更新条件更新 MongoDB 中的多个文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37530585/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com