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

Posted

技术标签:

【中文标题】Mongoose - 更新数组中的每个子文档(node.js)【英文标题】:Mongoose - Update each subdocument in array (node.js) 【发布时间】:2020-05-01 14:15:44 【问题描述】:

我重新阅读了所有的 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 值。使用数组 newName 它根本不起作用。

我该如何解决这个问题?每次都按对象_id 搜索不是一个选项。 谢谢!

【问题讨论】:

【参考方案1】:

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

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

第二个更安全的选择是设置Model.bulkWrite(),这将允许您使用一组updateOne“操作”通过多次编辑来更新文档。所以你会 find() 你想更新的数组/子文档,在 js 中创建你的 updateOne 命令数组,映射到子文档,直到你覆盖了所有需要更新的数组,然后调用 bulkWrite() 命令一次更新所有内容。

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

【讨论】:

以上是关于Mongoose - 更新数组中的每个子文档(node.js)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用猫鼬更新子文档数组中的特定元素? [复制]

使用 Mongoose 更新数组中的子文档

有没有办法通过在 Mongoose 中查询来更新文档数组中的对象?

Mongoose 不更新 mongodb 中的数组

更新对象数组中的元素在 Mongoose 中不起作用

如何用mongoose更新这个文档中的数组中的对象中的数组里的值?