在mongodb中如何更新多层嵌套对象数组结构下的某字段


如题:

数据实例:

{
    "_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  
  1. $是一个占位符一样的存在。代表被匹配的数组中的一个元素, 注意只能在一层嵌套的数组中使用 $
  2. 多层嵌套的数组中占位要用$[], 多层嵌套的查找条件, 可以使用arrayFilters来实现
  • $[idx] 中的idx 可以自定义名字,只需要arrayFilter中名字一样就可以,如 $[i], $[j]
  • 不止updateMany可以用,update、findAndUpdate、findAndModify 等也可以用
  • 可以与$[] 一起使用,需保证数组中的所有元素都满足后面的条件

  具体参考文档:https://www.cnblogs.com/zhongchengyi/p/12162792.html 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM