有没有办法通过在 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 返回更新的集合

Mongoose:通过 findOneAndUpdate 查询使用对象数组的总和更新根数据属性不起作用

Mongoose:通过 findOneAndUpdate 查询使用嵌套对象数组的总和更新父子数据属性不起作用

使 mongoose.js 查询同步运行