zoukankan      html  css  js  c++  java
  • 在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
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    《ASP.NET Core跨平台开发从入门到实战》Web API自定义格式化protobuf
    .NET Core中文分词组件jieba.NET Core
    .NET Core 2.0及.NET Standard 2.0
    Visual Studio 2017 通过SSH 调试Linux 上.NET Core
    Visual Studio 2017 ASP.NET Core开发
    Visual Studio 2017正式版离线安装及介绍
    在.NET Core 上运行的 WordPress
    IT人员如何开好站立会议
    puppeteer(二)操作实例——新Web自动化工具更轻巧更简单
    puppeteer(一)环境搭建——新Web自动化工具(同selenium)
  • 原文地址:https://www.cnblogs.com/Joans/p/15324820.html
Copyright © 2011-2022 走看看