如何使用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在一个语句中做到这一点吗?
5 个回答
5
这是我想到的:
location = Location.objects.get_or_create(user_id=user_id)[0]
location.point = point
location.save()
8
从0.9版本开始,有了一种新的做法(详细说明可以在这里找到):
location = Location.objects(user_id=user_id).modify(upsert=True, new=True, set__point=point)
这个方法会返回你创建或更新的对象。
47
请注意,get_or_create
这个功能现在计划要被淘汰,因为在MongoDB中没有事务支持,它无法保证操作的原子性,也就是说不能确保操作要么完全成功,要么完全失败。
推荐的做法是使用update 方法,并且开启 upsert 选项:
Location.objects(user_id=user_id).update_one(set__point=point, upsert=True)
关于 upsert 的更多信息,可以查看MongoDB 的文档。