Как сделать "вставить, если не существует еще обновление" с mongoengine? - PullRequest
20 голосов
/ 09 декабря 2011

Я работаю с mongoengine в Джанго,
это мое определение документа:

class Location(mongoengine.Document):  
    user_id = mongoengine.IntField(required=True)  
    point = mongoengine.GeoPointField(required=True)

Я хочу сделать это:
с учетом user_id и point:
если нет документа с таким user_id, создайте его с user_id и point и сохраните его;
иначе обновите документ с помощью user_id с point.
Могу ли я сделать это в одном утверждении с mongoengine?

Ответы [ 3 ]

39 голосов
/ 19 апреля 2013

Обратите внимание, что теперь get_or_create запланирован как устаревший, поскольку без поддержки транзакций в MongoDB он не может обеспечить атомарность.

Предпочтительным способом является обновление с помощью upsert:

Location.objects(user_id=user_id).update_one(set__point=point, upsert=True)

Подробнее о upserts в документации MongoDB .

5 голосов
/ 09 декабря 2011

вот что я придумал:

location = Location.objects.get_or_create(user_id=user_id)[0]  
location.point = point  
location.save()
2 голосов
/ 20 января 2015

Существует новый способ сделать это начиная с версии 0.9 (пояснено здесь ):

location = Location.objects(user_id=user_id).modify(upsert=True, new=True, set__point=point)

Возвращает созданный или обновленный объект.

...