如题:

数据实例:



{
"_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 等也可以用
  • 可以与$[] 一起使用,需保证数组中的所有元素都满足后面的条件