programing

mongo 엔진으로 "존재하지 않으면 삽입 업데이트"를 수행하는 방법은 무엇입니까?

oldcodes 2023. 6. 28. 21:57
반응형

mongo 엔진으로 "존재하지 않으면 삽입 업데이트"를 수행하는 방법은 무엇입니까?

일하고 .
제 정의입니다: 이이내정의다니입문서것.

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

이 작업을 수행합니다.
가 주어지면user_id a 리고a.point:
에 이 문서가 .user_id를 사용하여 하나를 만듭니다.user_id그리고.point 그것을저장합니다.
않으면 그지않으문업합다니로 합니다.user_id와 함께point.
mongoengine?한으로 할 수 ?

:get_or_createMongoDB에서 트랜잭션 지원이 없으면 원자성을 보장할 수 없기 때문에 이제 더 이상 사용되지 않도록 예약되었습니다.

기본 방법은 upsert를 사용하여 업데이트하는 것입니다.

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

MongoDB 설명서의 upsert에 대한 자세한 내용.

버전 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

▁method있다수니▁the 방법을 사용할 수 있습니다.update.

언급URL : https://stackoverflow.com/questions/8447502/how-to-do-insert-if-not-exist-else-update-with-mongoengine

반응형