在mongodb中通过子文档_id的数组更新多个子文档

时间:2019-01-31 05:51:26

标签: mongodb

我正在尝试通过给定的子文档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的数组。

1 个答案:

答案 0 :(得分:0)

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

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

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

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

console.log(arrOfObjectId)
结果: [ObjectId('xxxxxxxxxxxxxxxxxxxxxxxxxxx'),ObjectId('yyyyyyyyyyyyyyyyyyyyyy']] //正确

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();