【问题标题】:Updating a nested object in a document using mongoose使用猫鼬更新文档中的嵌套对象
【发布时间】:2022-01-14 18:33:42
【问题描述】:

我一直在尝试使用 findOneAndUpdate() 方法更新 Mongodb 文档中的特定对象,但没有任何运气。这就是我的收藏的样子

{
  _id: new ObjectId("61da0ab855483312e8f4483b"),
  products: [
    {
      createdAt: 2022-01-08T22:05:44.635Z,
      _id: new ObjectId("61da0ab855483312e8f4483c"),
      productCode: 'otf',
      productName: 'facebookmeta',
      claims: [Array],
      permissions: []
    },
    {
      createdAt: 2022-01-08T22:05:44.635Z,
      _id: new ObjectId("61da0ab855483312e8f4483f"),
      productCode: '4pf',
      productName: 'twitteroauth',
      claims: [Array],
      permissions: [Array]
    }
  ],
  __v: 0
}

当我尝试这样的事情时。我正在尝试根据其产品代码查找单个对象并更新该对象

ProductModel.findOneAndUpdate({productCode: userData.productCode}, dataToBeUpdated, {new: true})

它返回一个

Performing an update on the path '_id' would modify the immutable field '_id

我怀疑 MongoDB 正在对集合应用查询条件并返回匹配文档的结果,因此它可能返回两个对象,这可能是我遇到错误的原因,但我可能是错误的。

如何有效地将其指向正确的对象并执行更新

【问题讨论】:

    标签: javascript node.js mongodb mongoose odm


    【解决方案1】:

    MongoDB 支持使用位置运算符 ($) 对子文档进行单级深度更新。

    db.collection_name.update({
        _id: ObjectId("61da0ab855483312e8f4483b"),
        "products.productCode": "4pf"
    },
    {
        "$set": {
            "products.$.productName": "twitteroauth name updated"
        }
    })
    

    在上面的更新子句中,$ 将在运行时被子文档的匹配索引替换。

    例如 $ 将在运行时被值 1 替换,因为 "products.productCode": "4pf" 条件

    请注意以下几点:

    1. 您必须将数组字段作为查询文档的一部分。
    2. 位置运算符不能用于更新嵌套数组。

    其他参考:https://docs.mongodb.com/manual/reference/operator/update/positional/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-13
      • 1970-01-01
      • 2020-03-01
      • 2023-01-31
      • 2020-09-06
      • 2019-12-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多