MongoDB如何按_id批量更新嵌套子列表中不同元素的字段值
场景1:内存中操作JS/TS数组
适合数据已经加载到程序内存中的场景,通过多层遍历匹配_id完成更新:
// 原始数据 const originalData = [ { "user_id": "121212121", "list": [ { "employee_code": 8131, "list": [ { "_id": "1", "time": "5:20" }, { "_id": "2", "time": "8:20" } ] } ] } ] // 预设更新规则,后续新增更新项只需要改这个对象即可 const updateRules = { "1": "5:50", "2": "8:40" } // 执行更新 originalData.forEach(userItem => { userItem.list.forEach(employeeItem => { employeeItem.list.forEach(timeItem => { if (updateRules[timeItem._id]) { timeItem.time = updateRules[timeItem._id] } }) }) })
场景2:MongoDB数据库直接更新(v4.2及以上版本支持聚合管道更新)
如果数据存储在MongoDB中,可直接用原子更新语句操作,不需要先查再改:
db.collection.updateMany( // 匹配条件,可按需添加过滤规则缩小操作范围 {}, [ { $set: { "list": { $map: { input: "$list", as: "employee", in: { $mergeObjects: [ "$$employee", { "list": { $map: { input: "$$employee.list", as: "timeItem", in: { $mergeObjects: [ "$$timeItem", { time: { $switch: { branches: [ { case: { $eq: ["$$timeItem._id", "1"] }, then: "5:50" }, { case: { $eq: ["$$timeItem._id", "2"] }, then: "8:40" } ], default: "$$timeItem.time" } } } ] } } } } ] } } } } } ] )
通过$map遍历两层嵌套数组,配合$switch匹配不同_id对应的更新值,不会修改未匹配到的条目内容。
内容的提问来源于stack exchange,提问作者elad BA
相关产品推荐
相关产品推荐

