[英]How do I update if exist and insert if not using mongoengine (python)
[英]How to do "insert if not exist else update" with mongoengine?
我在 Django 中使用 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 在一个语句中做到这一点吗?
请注意, get_or_create
现在计划不推荐使用,因为MongoDB中没有事务支持,因此无法确保原子性。
首选方法是更新与更新插入:
Location.objects(user_id=user_id).update_one(set__point=point, upsert=True)
有关MongoDB文档的 upsert的更多信息 。
这就是我提出的:
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)
它返回创建或更新的对象。
或者您可以通过以下方式向您的 class object 添加一个方法:
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
我更新不存在的解决方案是这样的:
def upsert(self, data: dict, query: dict):
try:
sets = {}
for key in data.keys():
sets[f"set__{key}"] = data[key]
response = self.model.objects(**query).update_one(upsert=True, **sets)
return response
except Exception as ex:
# Logger(str(ex)).log_error()
return False
或者如果你愿意,你可以使用方法update
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.