Как сделать "вставить, если не существует другого обновления" с помощью 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