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