Как искать и обновлять значения в списке словарей, используя pymongo для записи mongo?

У меня есть запись монго, как это

    {
    "_id" : ObjectId("5fdc78778adbdedd17ce6ff3"),
    "solution_id" : "5fd6e275a675f2000134b243",
    "versions" : [
        {
            "local" : 2,
            "s3" : null
        }
    ]
}

Мне нужно найти и обновить значение ключа "s3" на «abc». Как это сделать с помощью pymongo?

Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
1
0
941
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вам нужен «маршрут» к конкретному ключу, чтобы иметь возможность установить его. Вы можете использовать запись через точку, чтобы определить элемент в структуре объекта, который необходимо обновить; в вашем случае это versions.0.s3. Если вы хотите сделать это на python и настроить свой код, это будет выглядеть так:

for i in cursor1:
    for index, j in enumerate(i.get('versions', [])):
        if j.get('local') == 2:
            db.mycollection.update_one({'_id': i.get('_id')}, {'$set': {f'versions.{index}.s3': 'abc'}})

Вы можете сделать все это за одну операцию обновления, используя позиционный оператор $ . NB Это обновляет только первое найденное совпадение local == 2; пример python обновит все соответствующие элементы в массиве.

db.mycollection.update_one({'_id': ObjectId(document_id), 'versions.local': 2}, {'$set': {'versions.$.s3': 'abc'}})

Опция 1

item_id = ObjectId("5fdc78778adbdedd17ce6ff3")

db.collection.update({'_id': item_id}, {'$set': {'versions.$.s3': 'abc'}})

Вариант 2

query = {}
item_id = ObjectId("5fdc78778adbdedd17ce6ff3")
items = db.collection.find({'_id': item_id})

for i, _ in enumerate(items):
    query[f'versions.{i}.s3'] = 'abc'

db.collection.update({'_id': item_id}, {'$set': query})

Другие вопросы по теме