2015-04-28 1 views
0

В MongoDb можно выполнить обновление всего, кроме поля, которое уже было обновлено, например, с помощью addToSet?addToSet и установить в том же обновлении с помощью PyMongo и MongoDB

Я храню информацию в словаре python, которая обновляется пользователем. Затем я хочу использовать этот словарь для обновления записи в MongoDb. Одно из полей - это массив, и я хочу вставить значение словаря, если его нет. Все остальное можно заменить. Проблема заключается в том, что использование набора со всем словарем заменяет массив единственным значением. Чтобы проиллюстрировать эту проблему:

создать словарь

thing = {} 
thing['name'] = 'fruit' 
thing['color'] = 'green' 
thing['types'] = ['apple', 'pear', 'kiwi'] 

вставить его:

c_users.insert_one(thing) 

Пользователь отмечает несколько полей для обновления

thing2 = {} 
thing2['name'] = 'fruit' 
thing2['color'] = 'darkgreen' 
thing2['types'] = 'mango' 

Тогда я пытаюсь обновить база данных

c_users.update ({'name': thing2 ['name']}, {'$ addToSet': {'types': thing2 ['types']}, '$ set': {'color': thing2}})

Можно ли использовать этот метод? Существуют и другие способы достижения такого же конечного результата, если не такие, как использование переменной вместо thing2 ['types'], но было бы лучше сохранить все значения в словаре.

ответ

0

Вы можете совать значение «Типы» из документа обновление:

>>> c_users.find_one() 
{u'color': u'green', u'_id': ObjectId('553fddc967d5bd0b07022477'), u'name': u'fruit', u'types': [u'apple', u'pear', u'kiwi']} 
>>> thing2 = {'name': 'fruit', 'color': 'darkgreen', 'types': 'mango'} 
>>> c_users.update({'name': thing2['name']}, {'$addToSet': {'types': thing2.pop('types')}, '$set': thing2}) 
{u'nModified': 1, u'ok': 1, u'n': 1, 'updatedExisting': True, u'electionId': ObjectId('553fc845f09926d0bb959eb7'), u'lastOp': Timestamp(1430249053, 1)} 
>>> c_users.find_one() 
{u'color': u'darkgreen', u'_id': ObjectId('553fddc967d5bd0b07022477'), u'name': u'fruit', u'types': [u'apple', u'pear', u'kiwi', u'mango']} 
Смежные вопросы