#python #mongodb
Вопрос:
Привет, я пытаюсь обновить значения в своей базе данных. У меня есть следующие данные:
{'_id': 123,
'keys':
{'values':
{'value1': 1,
'value2: 2,
}
{
Я пытаюсь обновить значения с помощью следующего запроса:
new_values = {'value3': 3,
'value4': 4}
col.update_one({'_id': 123},{"$set": {"keys": new_values}})
Ожидаемый результат:
{'_id': 123,
'keys':
{'values':
{'value1': 1,
'value2': 2,
'value3': 3,
'value4': 4,
}
{
Фактический результат:
{'_id': 123,
'keys':
{'values':
{'value3': 3,
'value4': 4,
}
{
Что мне не хватает, должен ли я обновлять это поле для поля в цикле над new_values
?
Комментарии:
1.
$set
является полной заменой-существующие значения отбрасываются.2. Проверьте около $push, который добавлял бы элементы вместо замены элементов. Кстати, ваш код {«$set»: {«ключи»: новые значения}} не может привести к тому, что вы сказали. Пожалуйста, в следующий раз сначала проверьте свой код.
Ответ №1:
Вы пытаетесь заменить значения в ключе values
вместо добавления новых вложенных ключей.
Есть два решения вашей проблемы.
Решение — 1
Укажите абсолютное имя ключа для каждого подключа в команде update
col.update_one({'_id': 123},{"$set": {"keys.values.value3": 3, "keys.values.value4": 4}})
Решение — 2
Получите существующее значение по find_one
команде и выполните update_one
операцию соединения двух словарей.
new_values = {'value3': 3,
'value4': 4}
temp = col.find_one({'_id': 123}, {"keys": 1})
dict_to_insert = {**new_values, **temp["keys"]["values"]}
col.update_one({'_id': 123},{"$set": {"keys.values": dict_to_insert}})
Я бы предложил вам перейти к решению 2, хотя оно выполняет дополнительную операцию чтения, чтобы выполнить ее.