gpt4 book ai didi

mongodb - 如何根据mongodb中嵌入式数组中AccountNum的长度更新所有TypeID

转载 作者:可可西里 更新时间:2023-11-01 09:39:47 26 4
gpt4 key购买 nike

我正在尝试根据 AccountNum 长度更新 TypeId。

如果AccountNum长度为4,TypeId应该更新为A1。

如果AccountNum长度为5,TypeId应该更新为A2。

同理,如果AccountNum长度为6,TypeId也要更新为A3。

{
"_id" : ObjectId("5770cf084e51b91816094201"),
"Organization" : ABC,

"Employees" : [
{
"EmpId":1,
"TypeID" : "A",
"AccountNum" : 54556

},
{
"EmpId":2,
"TypeID" : "A",
"AccountNum" : 545565

},
{
"EmpId":3,
"TypeID" : "A",
"AccountNum" : 54556567

}
]
}

最佳答案

目前不是最好的解决方案,因为您需要一种机制来遍历集合并针对每个文档循环嵌入数组,以识别每个 AccountNum使用 switch 的字段长度或 if else健康)状况。在那里面内部循环您设置一个新变量,该变量根据帐号长度保存新类型 ID。然后,您可以在同一个循环中更新集合。

整个操作有O(nm)复杂性 n是集合中文档的数量,m是最大值 Employees数组大小。

以下示例说明了这种方法:

db.collection.find({}).snapshot().forEach(function(doc) {
doc.Employees.forEach(function(emp){
var newTypeID, num = emp.AccountNum;
switch (true) {
case (num < 10000):
newTypeID = "A1";
break;
case (num >= 10000 && num < 100000):
newTypeID = "A2";
break;
case (num >= 100000 && num < 1000000):
newTypeID = "A3";
break;
default:
newTypeID = "A";
break;
}

db.collection.update(
{ "_id": doc._id, "Employees.AccountNum": emp.AccountNum },
{ "$set": { "Employees.$.TypeID": newTypeID } }
);
});
});

对于较大的集合,您会注意到性能下降。更好的方法是利用新的 bulkWrite() 用于批量更新集合的 API。这是高效的,因为它不会在您迭代时将每个更新请求发送到服务器,而是在每 500 个有序操作中发送一次,这样速度更快:

var bulkOps = [];
db.collection.find({}).snapshot().forEach(function(doc) {
doc.Employees.forEach(function(emp){
var newTypeID, num = emp.AccountNum;

switch (true) {
case (num < 10000):
newTypeID = "A1";
break;
case (num >= 10000 && num < 100000):
newTypeID = "A2";
break;
case (num >= 100000 && num < 1000000):
newTypeID = "A3";
break;
default:
newTypeID = "A";
break;
}

bulkOps.push({
"updateOne": {
"filter": { "_id": doc._id, "Employees.AccountNum": emp.AccountNum },
"update": {
"$set": { "Employees.$.TypeID": newTypeID }
}
}
});
});

// Send update request once in 500 batched operations only
if (bulkOps.length % 500 === 0) {
db.collection.bulkWrite(bulkOps);
bulkOps = [];
}
});

// Clear the remaining queue
if (bulkOps.length > 0) db.collection.bulkWrite(bulkOps);

关于mongodb - 如何根据mongodb中嵌入式数组中AccountNum的长度更新所有TypeID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38888688/

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