【问题标题】:Updating a nested record in mongodb array when you don't know the document index当您不知道文档索引时更新 mongodb 数组中的嵌套记录
【发布时间】:2021-07-08 06:32:57
【问题描述】:

我想更新一个嵌套文档的记录,我的文档是这样的:

[
  {
    "_id": "60753fd9b249ad0dfa1eeb48",
    "name": "Random Name 1",
    "email": "randomname1@zmel.kom",
    "likings": [
      {
        "breakfast": {
          "eat": "oats",
          "drink": "milk"
        }
      },
      {
        "lunch": {
          "eat": "beef",
          "drink": "pepsi"
        }
      },
      {
        "dinner": {
          "eat": "steak",
          "drink": "champagne"
        }
      }
    ]
  },
  {
    "_id": "60753fd9b249ad0dfa1eeb58",
    "name": "Random Name 2",
    "email": "randomname2@zmel.kom",
    "likings": [
      {
        "breakfast": {
          "eat": "cereals",
          "drink": "coffee"
        }
      },
      {
        "lunch": {
          "eat": "salad",
          "drink": "hot-water"
        }
      },
      {
        "dinner": {
          "eat": "biryani",
          "drink": "apple juice"
        }
      }
    ]
  }
]

现在我想将drink 的值更新为dinner 为Random Name 2 但我不知道晚餐的索引,它可能高于lunch,也可能低于@987654326 @.
这是我在 Python 中尝试过的:

oid = data[0]                # fetched from flask form
to_be_updated = data[1]      # fetched from flask form
update_value = data[2]       # fetched from flask form
condition = {"_id" : oid}
update_value = {
    "$set" : {
        f"likings.{to_be_updated}.drink" : update_value
    }
}
response = mongo.db.food.update(condition, update_value)

但我得到的错误是:
pymongo.errors.WriteError: Cannot create field 'dinner' in element <complete element description>
我计划使用的另一个策略是,仅匹配 ID,然后通过保持不需要更改的值并更改我想要更改的值来更新 likings。但是这种方法似乎太明显并且在语义上是错误的,因为我使用的是not updating but updating 类型的策略,即无缘无故地干扰集合模式。有没有办法做到这一点,或者我应该继续我的想法

【问题讨论】:

    标签: python mongodb flask pymongo flask-pymongo


    【解决方案1】:

    如果可能,将likings 从列表重构为对象。

    如果无法重构,请查看$ 和$[] 位置运算符https://docs.mongodb.com/manual/reference/operator/update/positional-all/

    【讨论】:

      【解决方案2】:

      演示:MongoDB Playground

      首先,您的 JSON 中有错误。

      JSON

      [
        {
          "_id": "60753fd9b249ad0dfa1eeb48",
          "name": "Random Name 1",
          "email": "randomname1@zmel.kom",
          "likings": [
            {
              "breakfast": {
                "eat": "oats",
                "drink": "milk"
              }
            },
            {
              "lunch": {
                "eat": "beef",
                "drink": "pepsi"
              }
            },
            {
              "dinner": {
                "eat": "steak",
                "drink": "champagne"
              }
            }
          ]
        },
        {
          "_id": "60753fd9b249ad0dfa1eeb58",
          "name": "Random Name 2",
          "email": "randomname2@zmel.kom",
          "likings": [
            {
              "breakfast": {
                "eat": "cereals",
                "drink": "coffee"
              }
            },
            {
              "lunch": {
                "eat": "salad",
                "drink": "hot-water"
              }
            },
            {
              "dinner": {
                "eat": "biryani",
                "drink": "apple juice"
              }
            }
          ]
        }
      ]
      

      试试这个:

      db.collection.update({
        "name": "Random Name 2",
        "likings.dinner": {
          "$exists": true
        }
      },
      {
        "$set": {
          "likings.$.dinner.drink": "PEPSI"
        }
      })
      

      您可以将dinner 更改为您想要相应更新的任何字段。

      【讨论】:

        猜你喜欢
        • 2017-04-28
        • 2013-03-19
        • 1970-01-01
        • 1970-01-01
        • 2017-06-05
        • 2019-12-13
        • 2016-11-23
        • 2016-08-04
        • 2010-11-11
        相关资源
        最近更新 更多