如何使用mongoengine“插入如果不存在其他更新”?

时间:2011-12-09 15:10:04

标签: python django mongodb mongoengine

我在Django与mongoengine合作 这是我的文件定义:

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

我想这样做:
给定user_idpoint
如果没有包含此user_id的文档,请使用user_idpoint创建一个并保存; 否则使用user_id point更新文档 我可以用mongoengine在一个声明中这样做吗?

4 个答案:

答案 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