【问题标题】:Is there a way to update an object in an array of a document by query in Mongoose?有没有办法通过在 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()

我想知道是否有任何原子方式来实现它。因为这种方法似乎并不安全。

【问题讨论】:

    标签: javascript mongodb mongoose nodes


    【解决方案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 原生的。
    猜你喜欢
    • 2017-12-21
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多