如題:
數據實例:
{ "_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