如何使用mongoengine实现"如果不存在则插入,否则更新"?

28 投票
5 回答
21585 浏览
提问于 2025-04-17 08:03

我正在Django中使用mongoengine,
这是我的文档定义:

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

我想要做的是:
给定一个 user_id 和一个 point
如果没有文档包含这个 user_id,就创建一个新的文档,里面有 user_idpoint,然后保存;
否则,就更新已有的那个包含 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 的文档

撰写回答