У меня есть запись монго, как это
{
"_id" : ObjectId("5fdc78778adbdedd17ce6ff3"),
"solution_id" : "5fd6e275a675f2000134b243",
"versions" : [
{
"local" : 2,
"s3" : null
}
]
}
Мне нужно найти и обновить значение ключа "s3"
на «abc». Как это сделать с помощью pymongo?
Вам нужен «маршрут» к конкретному ключу, чтобы иметь возможность установить его. Вы можете использовать запись через точку, чтобы определить элемент в структуре объекта, который необходимо обновить; в вашем случае это 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'}})
item_id = ObjectId("5fdc78778adbdedd17ce6ff3")
db.collection.update({'_id': item_id}, {'$set': {'versions.$.s3': 'abc'}})
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})