猫鼬-更新数组(node.js)中的每个子文档

时间:2020-01-14 19:49:33

标签: arrays node.js mongodb mongoose subdocument

我重新阅读了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进行搜索。 谢谢!

1 个答案:

答案 0 :(得分:0)

实际上,您当前的更新只会使用位置运算符($)更新数组中的第一个元素,而使用“所有位置运算符”($ [])将所有元素更新为相同值。我发现,对数组/子文档进行多次编辑对于猫鼬来说有点棘手。

我认为您可以通过几种方法来解决这个问题。也许是幼稚的(不建议使用)方法是:find()要更新的文档,然后处理文档对象,遍历要更新的数组以更新每个对象(使用标准js数组迭代器来匹配索引)在主文档上调用save()之前)。但是,我相信这可能会冒着其他人尝试在您的检索,更新和写回窗口期间更新文档的风险,因为它不是原子的。

第二个更安全的选择是设置Model.bulkWrite(),这将允许您使用updateOne'ops'数组通过多次编辑来就地更新文档。因此,您将找到要更新的数组/子文档,在js中创建updateOne命令的数组,在子文档上进行映射,直到覆盖了所有需要更新的数组,然后调用bulkWrite()命令以一口气更新所有内容。

希望这会为您指明正确的方向。祝你好运!