我重新阅读了Google的全部内容,但找不到正确的答案。我真的很希望您的帮助!
我可以更新items数组中的所有子文档吗?这是示例:
const newName = ['First', 'Second', 'Third'];
{
_id: ObjectId('1')
items: [
{
_id: ObjectId('11'),
name: ''
},
{
_id: ObjectId('12')
name: ''
},
{
_id: ObjectId('13')
name: ''
}
]
}
我想做什么:
.update({ _id: ObjectId('1') }, {$set: { 'items.$.name': newName }},false,true);
但是,仅当newName
是String且仅对数组中的第一个对象有效。 $[]
的操作相同,但有一个例外,每个对象中都设置了相同的String
值。对于数组newName
,它根本无法工作。
如何解决此问题?每次都不能通过对象_id
进行搜索。
谢谢!
答案 0 :(得分:0)
实际上,您当前的更新只会使用位置运算符($)更新数组中的第一个元素,而使用“所有位置运算符”($ [])将所有元素更新为相同值。我发现,对数组/子文档进行多次编辑对于猫鼬来说有点棘手。
我认为您可以通过几种方法来解决这个问题。也许是幼稚的(不建议使用)方法是:find()要更新的文档,然后处理文档对象,遍历要更新的数组以更新每个对象(使用标准js数组迭代器来匹配索引)在主文档上调用save()之前)。但是,我相信这可能会冒着其他人尝试在您的检索,更新和写回窗口期间更新文档的风险,因为它不是原子的。
第二个更安全的选择是设置Model.bulkWrite(),这将允许您使用updateOne'ops'数组通过多次编辑来就地更新文档。因此,您将找到要更新的数组/子文档,在js中创建updateOne命令的数组,在子文档上进行映射,直到覆盖了所有需要更新的数组,然后调用bulkWrite()命令以一口气更新所有内容。
希望这会为您指明正确的方向。祝你好运!