2013-04-19 5 views
2

У меня есть модель, которая выглядит следующим образом:Mongoengine - как атомно обновить словарь?

class TestDoc(Document): 
    name = StringField() 
    friends = ListField(StringField()) 
    address_book = DictField() 

И я хотел бы атомарно обновить поле address_book всякий раз, когда изменяется список друзей. Как я могу изменить оба поля в атомной операции? Я не могу найти какой-либо модификатор в документации:

https://mongoengine-odm.readthedocs.org/en/latest/guide/querying.html#atomic-updates

, что делает атомарное обновление словарей. Спасибо!

ответ

3

Когда каждый вы делаете $push или $pull из friends поля вы также в том же самом обновлении необходимо изменить address_book например:

TestDoc(name="Sue", friends=["Bob", "Sarah"], 
     address_book={"Bob": "1 the farm", "Sarah": "Owl house"}).save() 

TestDoc.objects(name="Sue").update(pull__friends="Bob", 
            unset__address_book__Bob=1) 
+0

ооо, я вижу: так вы получаете доступ к элементу словаря под названием Боб использовал __ ... Ах, я должен был подумать об этом! Еще раз спасибо, Росс! – Clara

+0

Росс, у меня есть другой вопрос: что, если поле слова address_book будет выглядеть так: address_book = {"Mary": {"parents_address": ["12 OceanWay", "13 Long Rd"]}, "Bob": {" work_address ": [" 45 CentralRd "]}}? Как я мог атомизировать обновление, например, «12 OceanWay», чтобы изменить его на «13 OceanWay»? – Clara

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