• 在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" : "初级:常规决定:在收集到较为充分的信息后,清楚地向团队成员表明自己的要求,并给予他们基本的、例行的指示,但当对一些例外事项或突发事件时,往往需要借助他人力量。
    
    中级:立场坚定:能够坚持立场,决策时以事实为依据,拒绝他人不合理的要求;对一些例外事项和突发事件也能独立判断,做出决策。
    
    中高级:全面考虑:面对有竞争性的方案时,能够全面考虑各方意见,细致分析影响因素,认真对比各个备选方案,及时不拖延的做出决定。
    
    高级:风险决策:能够合理预测决策可能带来的风险,衡量潜在的收益,及时做出抉择,并勇于承担风险。
    
    卓越级:长远规划:在复杂、模糊且风险很高的形势下,或能够在大多数人反对的情况下仍坚持观点,毫不犹豫地做出对组织有长远影响的有利决策。",
                                "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 

    作者:Joan
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    https协议介绍
    最详尽的fidder抓取https请求
    最详尽的datagrip使用
    datagrip安装与破解
    二叉树
    使用nexus搭建maven私库
    markdown利器-小书匠
    java开发-flyway
    .NetCore 入门
    .Net Core 实体生成器
  • 原文地址:https://www.cnblogs.com/Joans/p/15324820.html
Copyright © 2020-2023  润新知