我在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在一个声明中这样做吗?
答案 0 :(得分:39)
请注意,get_or_create
现在计划不推荐使用,因为MongoDB中没有事务支持,因此无法确保原子性。
首选方法是update with upsert:
Location.objects(user_id=user_id).update_one(set__point=point, upsert=True)
有关MongoDB documentation上的upsert的更多信息。
答案 1 :(得分:5)
这就是我提出的:
location = Location.objects.get_or_create(user_id=user_id)[0]
location.point = point
location.save()
答案 2 :(得分:2)
从版本0.9开始,有一种新的方法(解释here):
location = Location.objects(user_id=user_id).modify(upsert=True, new=True, set__point=point)
它返回创建或更新的对象。
答案 3 :(得分:0)
或者您可以通过以下方式将方法添加到类对象中:
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