Обновите значения mongo

#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, хотя оно выполняет дополнительную операцию чтения, чтобы выполнить ее.