如何用mongoengine做“insert if not exist else update”?

2024-09-29 05:14:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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_idpoint更新文档。
我可以在mongoengine的一个声明中这样做吗?


Tags: 文件django文档idtrue定义requiredlocation
3条回答

这就是我想到的:

location = Location.objects.get_or_create(user_id=user_id)[0]  
location.point = point  
location.save()

注意,get_or_create现在被安排为不推荐使用,因为在MongoDB中没有事务支持,它无法确保原子性。

首选方法是update加upsert:

Location.objects(user_id=user_id).update_one(set__point=point, upsert=True)

更多关于MongoDB documentation上upserts的信息。

从0.9版(解释了here)开始,就有了一种新的方法:

location = Location.objects(user_id=user_id).modify(upsert=True, new=True, set__point=point)

它返回创建或更新的对象。

相关问题 更多 >