Как сделать "insert if not exist else update" с помощью mongoengine?

Я работаю с mongoengine в Django,
это мой документ defination:

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 ответов


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

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

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

больше на upserts на документация MongoDB.


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

location = Location.objects.get_or_create(user_id=user_id)[0]  
location.point = point  
location.save()

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

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

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