繁体   English   中英

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

[英]How to do "insert if not exist else update" with 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_idpoint更新文档。
我可以用 mongoengine 在一个语句中做到这一点吗?

请注意, get_or_create现在计划不推荐使用,因为MongoDB中没有事务支持,因此无法确保原子性。

首选方法是更新与更新插入:

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

有关MongoDB文档的 upsert的更多信息

这就是我提出的:

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

从版本0.9开始,有一种新的方法( 在此解释):

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

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

或者您可以通过以下方式向您的 class object 添加一个方法:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM