如何用蒙古引擎做"insert if not exist else update"?



我在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在一个语句中做到这一点吗?

请注意,get_or_create现在被计划弃用,因为在MongoDB中没有事务支持,它不能确保原子性。

首选的方法是使用upsert:

进行更新。
Location.objects(user_id=user_id).update_one(set__point=point, upsert=True)

自0.9版以来有一种新的方法(在这里解释):

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

返回创建或更新的对象。

我是这么想的:

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

或者您可以通过:

为您的类对象添加一个方法:
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

我的解决方案是:

    def upsert(self, data: dict, query: dict):
        try:
            sets = {}
            for key in data.keys():
                sets[f"set__{key}"] = data[key]
            response = self.model.objects(**query).update_one(upsert=True, **sets)
            return response
        except Exception as ex:
            # Logger(str(ex)).log_error()
            return False

或者如果您愿意,您可以使用update方法

相关内容

最新更新