mongodb - 通过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 的数组。
解决方案
方法 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();
推荐阅读
- python - Django循环导入错误,试图允许位置访问活动
- swiftui - 如何在 SwiftUI 中动态调整图像大小以实现可访问性?
- angularjs - 角度绑定到弹出框
- android - DataBindingMergeDependencyArtifact 正在减慢构建速度
- xslt - 如何只匹配xslt中的节点一次并将它们过滤掉
- c - C中的AVL旋转
- python - 使用 Python 进行呼叫量预测
- php - 匹配特定字符后括号中的所有内容
- javascript - 当您使用 Array(n).fill(Array(m).fill('_')) 并尝试更改 1 个字段时会发生什么,它会更改多个
- matplotlib - Seaborn regplot 带有水平子图,sharey=True 并显示 y 刻度标签