如何在mongodb中更新3-d嵌套数组的元素?

时间:2019-06-18 12:01:19

标签: mongodb

我想更新MongoDB中嵌套数组中元素的值。我所拥有的只是一个用于检查和修改其值的密钥。

{
    details:{
        name:"sweta",
        age:"12"
    },
    imageNames:[
       0:{
          userData:[
             0:{
                imageName : "0_abc_0.jpg",
                state:"hold"
             },
             1:{
                imageName : "1_def_1.jpg",
                state:"hold"
             }
          ]
       },
       1:{
          userData:[
             0:{
                imageName : "0_kkk_0.jpg",
                state:"hold"
             },
             1:{
                imageName : "1_jjj_1.jpg",
                state:"hold"
             }
          ]
       },

    ]

}



 let imageName = "abc.jpg"
 const [name,ex] = imageName.split('.');
 const regex = new RegExp(`\\d_${name}_\\d.${ex}`,"gi");
 let state = 'completed';

 db.update(
    {
        "details.name":"sweta","imageNames":{
            "$elemMatch":{
                "userData.imageName":{"$regex":regex}
            }
        }
    },
    { $set: { 'imageNames.$.userData.$.state': state }}
  )

我有一个名称和imageName可以过滤掉。但是我拥有的imageName是“ abc.jpg”,这就是为什么我使用正则表达式。

我想将状态“保持”更新为“完成”,那么该怎么做呢? 有人知道吗?我尝试过,但出现错误。

1 个答案:

答案 0 :(得分:0)

如果您使用的是MongoDB版本> 3.6,则可以使用arrayFilters快速获得image的正确索引:

db.users.updateOne({
    'details.name': 'sweta',
    'imageNames.userData.imageName': {
        $regex: '_abc_'
    }
}, {
    $set: {
        'imageNames.$[].userData.$[data].state': 'completed'
    }
}, {
    arrayFilters: [{
        'data.imageName': {
            $regex: "_abc_"
        }
    }]
})