Обновление вложенного документа MongoDB не выдает ошибку и не обновляет документ с помощью python

#python-3.x #mongodb

#python-3.x #mongodb

Вопрос:

Я пытаюсь обновить документ в приведенной ниже коллекции MongoDB. Он не выдает ошибку и не обновляет документ.

Вот моя коллекция:

 customer_docs = [
  {
    "customerName": "Yeshua Galisanao",
    "msgId": "100",
    "productDetails": [
      {
        "productName": "prod1",
        "prodSerialNum": "sdgha53643657354"
      },
      {
        "productName": "prod2",
        "prodSerialNum": "fafruirykjnjhgukg"
      }
    ],
    "customer-address": [
      {
        "primaryAddress": [
          {
            "street": "#43 Easy Street",
            "city": "Niceton",
            "state": "PH",
            "zip": "57733"
          }
        ]
      },
      {
        "secondaryAddress": [
          {
            "street": "23",
            "city": "seattle"
          }
        ]
      }
    ]
  },
  {
    "customerName": "Karl Mike",
    "msgId": "101",
    "productDetails": [
      {
        "productName": "prod10",
        "prodSerialNum": "764hreopirrrhfnsf"
      },
      {
        "productName": "prod11",
        "prodSerialNum": "fsdfhsfybdfmdsgfyuu"
      }
    ],
    "customer-address": [
      {
        "primaryAddress": [
          {
            "street": "#66 Easy Street",
            "zip": "57733"
          }
        ]
      }
    ]
  }
]
  

Вот код python, который пытается обновить серийный номер для клиента «Karl Mike» до «newSerailNumber»:

 client = pymongo.MongoClient("mongodb://127.0.0.1:27017")
db = client.MyDb
customer_col = db.customer

my_query1 = {"customerName": "Karl Mike"}
for customer in customer_col.find(my_query1):
    for prod in customer["productDetails"]:
        if prod["productName"] == "prod1" and prod["prodSerialNum"] != "abcdefghijklmop":
            my_query2 = {
                "customer": "Karl Mike",
                "productDetails.productName": "prod1"
            }
            customer_col.update_one(my_query2, {"$set": {"productDetails.0.prodSerialNum": "newSerailNumber"}})
            print("oops reached")
  

Но обновление документа здесь не происходит. Что я делаю не так? Почему сбой обновления документа не выдает никакой ошибки?

Ответ №1:

Это моя ошибка! Прежде всего, в моем коде есть опечатка. Вместо использования "customerName" in my_query2 я использовал "customer" as key .

Приведенный ниже код просто отлично работает:

 my_query1 = {"customerName": message["customer_name"]}
for customer in customer_col.find(my_query1):
    for prod in customer["productDetails"]:
        if message["prod"] == prod["productName"] and message["serial_number"] != prod["prodSerialNum"]:
            my_query2 = {
                "customerName": "Karl Mike",
                "productDetails.productName": "prod1",
                "productDetails.prodSerialNum": prod["prodSerialNum"]
            }
            customer_col.update_many(my_query2, {"$set": {"productDetails.$.prodSerialNum": "newSerailNumber"}})
            print("oops reached")
  

Но все еще интересно — почему для того же не было выдано ошибки.