有没有办法通过在 Mongoose 中查询来更新文档数组中的对象?
Posted
技术标签:
【中文标题】有没有办法通过在 Mongoose 中查询来更新文档数组中的对象?【英文标题】:Is there a way to update an object in an array of a document by query in Mongoose? 【发布时间】:2022-01-10 15:42:55 【问题描述】:我有一个数据结构:
field: 1,
field: 3,
field: [
_id: xxx , subfield: 1 ,
_id: xxx , subfield: 1 ,
]
我需要更新数组中的某个元素。
到目前为止,我只能通过拉出旧对象并推入新对象来做到这一点,但这会改变文件顺序。
我的实现:
const product = await ProductModel.findOne( _id: productID );
const price = product.prices.find( (price: any) => price._id == id );
if(!price)
throw
type: 'ProductPriceError',
code: 404,
message: `Coundn't find price with provided ID: $id`,
success: false,
product.prices.pull( _id: id )
product.prices.push(Object.assign(price, payload))
await product.save()
我想知道是否有任何原子方式来实现它。因为这种方法似乎并不安全。
【问题讨论】:
【参考方案1】:是的,如果你能找到它,你可以更新数组中的特定对象。 看看位置“$”运算符here。
您当前使用 mongoose 的实现将有点像这样:
await ProductModel.updateOne(
_id: productID, 'prices._id': id ,//Finding Product with the particular price
$set: 'prices.$.subField': subFieldValue ,
);
注意 prices.$.subField 中的“$”符号。 MongoDB 足够聪明,只更新查询找到的索引处的元素。
【讨论】:
非常感谢!有什么方法可以传递一个没有提及更新中所有字段的有效负载对象,如下所示: $set: 'prices.$': payload
。它会这样工作吗?
我没试过。我和猫鼬一起工作已经一年多了:)。但根据文档,这应该有效。来自文档:db.collection.update( <array>: value ... , <update operator>: "<array>.$" : value )
是的,确实如此。你节省了很多时间。感谢您再次光临!
如果不是秘密,你现在在做什么?
这取决于你正在构建什么。但一般来说,对于大型项目,SQL 由于其模式严格性和查询能力要好得多。当你有一个大团队在一个项目上工作时,有一个模式是必要的。像 Mongoose 这样的 ORM 确实在一定程度上提供了这些,但它不是 MongoDB 原生的。以上是关于有没有办法通过在 Mongoose 中查询来更新文档数组中的对象?的主要内容,如果未能解决你的问题,请参考以下文章
通过在 body、mongoose/mongodb 中提供文档来更新多个文档
有没有办法从 Mongoose 的一个查询中的参数创建父级及其子级?
Mongoose:通过 findOneAndUpdate 查询使用对象数组的总和更新根数据属性不起作用