2015-07-21 2 views
2

Как обновить дубликарный элемент записи, чтобы добавить новый ключ, если он не существует, или обновить соответствующее значение ключа, если оно существует. Например:pymongo, mongodb добавить новый ключ к существующему словарю

record = {'_id':1, 
      'value': {'key1' : '200'}} 

Я хочу, чтобы обновить 'value' путем добавления новой пары ключ-значение. например value={'key2':'300'}. Так что мой желательно обновленный отчет будет:

record = {'_id':1, 
       'value': {'key1' : '200', 
          'key2' : '300'}} 

Я пробовал:

value={'key2':'300'} 
    mongo.db['mydb'].update(
      {'_id': 1}, 
      {'$set': {'value': value}}) 

Но переписывает «значение» и не добавляет новый ключ к нему:

record = {'_id':1, 
      'value': {'key2' : '300'}} 

Как я могу это достичь?

ответ

1

Вы нужно использовать "dot notation"

In [20]: col.find_one() 
Out[20]: {'_id': 1, 'value': {'key1': '200'}} 

In [21]: col.update({'_id': 1}, {'$set': {'value.key2': 300}}) 
Out[21]: {'n': 1, 'nModified': 1, 'ok': 1, 'updatedExisting': True} 

In [22]: col.find_one() 
Out[22]: {'_id': 1, 'value': {'key1': '200', 'key2': 300}} 

РЕДАКТИРОВАНИЕ

Если ключ находится в переменной все, что вам нужно, это конкатенация:

In [37]: key2 = 'new_key' 

In [38]: col.update({'_id': 1}, {'$set': {'value.' + key2: 'blah'}}) 
Out[38]: {'n': 1, 'nModified': 1, 'ok': 1, 'updatedExisting': True} 

In [39]: col.find_one() 
Out[39]: {'_id': 1, 'value': {'key1': '200', 'new_key': 'blah'}} 
+0

Что делать, если '' key2'' хранится в переменной, могу ли я использовать точечную нотацию? (Он исходит из формы на стороне клиента и сохраняется в переменной) – CentAu

+0

вы все еще можете использовать точечную нотацию '{'$ set': {'value.key2': key2}}' – styvane

+0

Я имею в виду, что key2 является переменной например '' Key2 = 'new_key'''. Я использовал '' {'$ set': {'value.key2': 'blah'}} '', он дает мне: '' {'значение': {'key2': 'blah'}} '', Where как мне нужно: '' {'value': {'new_key': 'blah'}} '' – CentAu

Смежные вопросы