在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