首页 > 解决方案 > 通过mongodb中的子文档_id数组更新多个子文档

问题描述

我正在尝试通过给定的子文档 ID 数组更新多个子文档。我尝试了多种方法,但它不起作用。在我的场景中,我需要通过给定的 id 数组更新多个子文档。这是我的查询如下:

方法 1.(没有元素更新)

var updated = await ModelName.update(
                {
                    'subDocArray._id' : {  $in: req.body.elementId  } 
                },
                {
                    $set: {
                        'subDocArray.$[elem].abc': req.body.abcValue,
                        'subDocArray.$[elem].xyz': req.body.xyzValue
                    },
                },{ "arrayFilters": [{ "elem._id":  {  $in: req.body.elementId  }  }], "multi": true, "upsert": true }
            ).lean().exec();

方法2:(只有第一个发生的元素正在更新)

var updated = await ModelName.update(
                {
                    'subDocArray._id' : {  $in: req.body.elementId  } 
                },
                {
                    $set: {
                        'subDocArray.$.abc': req.body.abcValue,
                        'subDocArray.$.xyz': req.body.xyzValue
                    },
                },{ multi: true}
            ).exec();

req.body.elementId是子文档 ID 的数组。

标签: mongodb

解决方案


方法 1几乎是正确的。我传递的是字符串格式的elementId数组,所以我将它们转换为ObjectId形式,然后它就可以工作了。

var arrOfObjectId = [];
req.body.elementId.forEach(elem => {
    arrOfObjectId.push(Types.ObjectId(elem))
});

为了找到两个数组之间的区别,我在控制台中打印了两个数组,如下所示:

console.log(req.body.elementId)
结果: ['xxxxxxxxxxxxxxxxxxxxxxxxxxx','yyyyyyyyyyyyyyyyyyyyyyy'] //错误

console.log(arrOfObjectId)
Result: [ObjectId('xxxxxxxxxxxxxxxxxxxxxxxx'),ObjectId('yyyyyyyyyyyyyyyyyyyyyyy')] //RIGHT

var updated = await ModelName.update(
                {
                    'subDocArray._id' : {  $in: arrOfObjectId  } 
                },
                {
                    $set: {
                        'subDocArray.$[elem].abc': req.body.abcValue,
                        'subDocArray.$[elem].xyz': req.body.xyzValue
                    },
                },{ "arrayFilters": [{ "elem._id":  {  $in: arrOfObjectId  }  }], "multi": true, "upsert": true }
            ).lean().exec();

推荐阅读