如题:
数据实例:
{ "_id" : ObjectId("613ed7b5bcd31604f0d9e8b0"), "subordinate_weight" : 10, "lastDate" : ISODate("2021-09-25T00:00:00.000Z"), "dimensions" : [ { "actual_number_of_people" : 1, "status" : "1", "f_score" : 64, "score" : 12.8, "_id" : ObjectId("613ed7b5bcd31604f0d9e8d0"), "items" : [ { "f_score" : 60, "score" : 12, "status" : "1", "_id" : ObjectId("613ed7b5bcd31604f0d9e8e0"), "qtis" : [ { "source" : "3", "f_score" : 60, "score" : 12, "status" : "1", "_id" : ObjectId("613ed7b5bcd31604f0d9e8e1"), "peoples" : [ { "status" : "1", "_id" : ObjectId("613ed7b5bcd31604f0d9e8e2"), "people" : ObjectId("60ebac2b789ec93bd0488f32"), "f_score" : 60, "submitDate" : ISODate("2021-09-14T00:55:56.659Z") } ], "qti_name" : "决策能力", "competencyclient" : ObjectId("6139f1ff240e856701e8bb72"), "scoring_criteria" : "初级:常规决定:在收集到较为充分的信息后,清楚地向团队成员表明自己的要求,并给予他们基本的、例行的指示,但当对一些例外事项或突发事件时,往往需要借助他人力量。\n\n中级:立场坚定:能够坚持立场,决策时以事实为依据,拒绝他人不合理的要求;对一些例外事项和突发事件也能独立判断,做出决策。\n\n中高级:全面考虑:面对有竞争性的方案时,能够全面考虑各方意见,细致分析影响因素,认真对比各个备选方案,及时不拖延的做出决定。\n\n高级:风险决策:能够合理预测决策可能带来的风险,衡量潜在的收益,及时做出抉择,并勇于承担风险。\n\n卓越级:长远规划:在复杂、模糊且风险很高的形势下,或能够在大多数人反对的情况下仍坚持观点,毫不犹豫地做出对组织有长远影响的有利决策。", "qti_weight" : 20 } ], "category" : "核心价值观", "weight" : 20 } ], "peoples" : [ { "_id" : ObjectId("613ed7b5bcd31604f0d9e8e3"), "people" : ObjectId("60ebac2b789ec93bd0488f32"), "submitDate" : ISODate("2021-09-14T00:55:56.530Z") } ], "dimension" : "3", "number_of_people" : 1, "weight" : 20 }, ], }
以上一个对象里嵌套了4层数组结构: dimensions->items ->qtis->peoples
现在要修改peoples这个对象下面的status值为0。
我想更新数组中的数组下的一个元素这么办呢?一般会想到两种方法:1、遍历数组修改,2、使用 arrayFilter。个人推荐 arrayFilter 方式。
1,遍历数组方式,就是通过find找到这条数据,然后不断的循环, 改掉整个数组对象,然后进行赋值,在保存。
2.arrayFilter方法
let update_result = await Questionnair360AndCAInstance.update(
{_id: arr_result[k]._id}, //要更新的数据的id
{$set:{"dimensions.$[].items.$[].qtis.$[].peoples.$[idex1].status": '0'}}, //更新值
{arrayFilters: [{'idex1._id': arr_result[k].done_people._id}] } //数组条件,找到某一个peoples对象下的_id与之配置的值进行修改,如果不加,会把所有peoples数组中的所有对象的status值都变掉
)
//不加的情况:
let update_result = await Questionnair360AndCAInstance.update(
{_id: arr_result[k]._id}, //要更新的数据的id
{$set:{"dimensions.$[].items.$[].qtis.$[].peoples.$[].status": '0'}} //更新值
)
基础语法:
- "<array>.$" : value
- $是一个占位符一样的存在。代表被匹配的数组中的一个元素, 注意只能在一层嵌套的数组中使用 $
- 多层嵌套的数组中占位要用$[], 多层嵌套的查找条件, 可以使用arrayFilters来实现
- $[idx] 中的idx 可以自定义名字,只需要arrayFilter中名字一样就可以,如 $[i], $[j]
- 不止updateMany可以用,update、findAndUpdate、findAndModify 等也可以用
- 可以与$[] 一起使用,需保证数组中的所有元素都满足后面的条件
具体参考文档:https://www.cnblogs.com/zhongchengyi/p/12162792.html
作者:Joan
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。