How to do “insert if not exist else update” with mongoengine?

前端 未结 4 1094
孤独总比滥情好
孤独总比滥情好 2020-12-14 17:56

I\'m working with mongoengine in Django,
this is my document defination:

class Location(mongoengine.Document):  
    user_id = mongoengine.IntField(req         


        
相关标签:
4条回答
  • 2020-12-14 18:38

    There is a new way to do it since version 0.9 (explained here):

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

    It returns the created or updated object.

    0 讨论(0)
  • 2020-12-14 18:46

    Note that get_or_create is now scheduled to be deprecated, because with no transaction support in MongoDB it cannot ensure atomicity.

    The preferred way is update with upsert:

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

    More on upserts on the MongoDB documentation.

    0 讨论(0)
  • this is what I came up with:

    location = Location.objects.get_or_create(user_id=user_id)[0]  
    location.point = point  
    location.save()
    
    0 讨论(0)
  • 2020-12-14 18:48

    Or you can add a method to your class object via:

    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
    
    0 讨论(0)
提交回复
热议问题