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