Как сделать "вставить, если не существует другого обновления" с помощью mongoengine?

Я работаю с mongoengine в Django,
это моя защита документа:

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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

Или вы можете добавить метод к вашему объекту класса через:

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

    def register(self):
        # if doesnt exist, create user id and point field
        if not Location.objects(user_id=self.user_id):
            self.user_id = self.user_id
            self.point = self.point
            self.save()
            return True
        # does exist, do nothing
        else:
            return False