在不知道文档索引时更新mongodb数组中的嵌套记录

2024-06-09 01:43:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我想更新嵌套文档的记录,我的文档如下所示:

[
  {
    "_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"
        }
      }
    ]
  }
]

现在我想更新drinkdinnerRandom Name 2drink的值,但我不知道晚餐的索引,它可能在lunch之上,也可能在breakfast之下。
以下是我在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种策略,即无实际原因地干扰集合模式。有没有办法做到这一点,或者我应该继续我的想法


Tags: namefromidflaskdatavalueupdaterandom
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更改为要相应更新的任何字段

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

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

相关问题 更多 >