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)的主要内容,如果未能解决你的问题,请参考以下文章