MongoDB 多层数组对象 筛选局部更新

卜卜口代码

数据格式样例

{ 
    "_id" : ObjectId("..."), 
    "id" : 2102855644, 
    "title" : "その未来へ", 
    "disks" : [ 
        { 
            "title" : "disc 1", 
            "tracks" : [ 
                { 
                    "id" : 1796759555, 
                    "title" : "その未来へ", 
                    "sub" : "电视动画「泥鲸之子们在沙地上歌唱」OP / TVアニメ『クジラの子らは砂上に歌う』オープニングテーマ", 
                    "duration" : 256, 
                    "fix" : true 
                }, 
                ... 
            ] 
        }, 
        ... 
    ] 
} 

目标是更新 track 中的 fixfalse,同时不影响其他同层级的数据

在更新时临时命名 track,然后借助 arrayFilters 在更新时进行过滤

实现

db.albums.update( 
    { 'disks.tracks.id': 1796759555 }, 
    { 
        $inc:{ 
            'disks.$[].tracks.$[track].fix':false 
        } 
    },{ 
    arrayFilters: [ 
            { 
                "track.id": 1796759555 
            } 
        ], 
        multi: false 
    } 
) 

文档

https://docs.mongodb.com/manual/reference/operator/update/positional-all/#update-nested-arrays-in-conjunction-with-identifier