본문 바로가기
MongoDB/MongoDB Atlas CRUD 다루기

MongoDB Atlas 클러스터(데이터베이스) access하기&CRUD하기 - 7. update_many()

by Fletcher 2024. 7. 28.

※ 참고자료 ※

PyMongo 4.8.0 Documentation Reference Link

https://pymongo.readthedocs.io/en/stable/index.html

 

 

 

반갑습니다!

저번 포스트에서 update_one()에 대해서 알아보았습니다

이번에는 데이터 갱신의 나머지 함수들인

update_many()와 replace_one()에 대해서 나눠보겠습니다

 

그리고 그 이후에 도큐먼트의 변경 사항을

모니터링하는 부분에 대해서 살펴보도록 하겠습니다

 

 

 

 

#MongoDB Update - update_many() 테스트
class MongoDBUpdateManyResource(Resource):
    def put(self):

        data = request.get_json()

        # 클러스터 접근을 위한 클라이언트 객체 생성
        client = pymongo.MongoClient(Config.MONGO_DB_URI)

        # 컬렉션 정보 저장
        database = client["project-server"]
        collection = database["MongoDB_TEST"]

        # 다중 항목 갱신
        result = collection.update_many(
            {"is_publish":data['before_is_publish']},
            {"$set":{"is_publish":data['after_is_publish']}},
            upsert=True
            )

        # 리소스 종료
        client.close()

        return {"acknowledged":result.acknowledged,
                "matched_count":result.matched_count,
                "modified_count":result.modified_count,
                "upserted_id":str(result.upserted_id)}, 200

 

일전에 예시용으로 생성해둔 더미 데이터들 중에서 "is_publish" 필드 값을 한 번 변경해보겠습니다

지난 포스트에서 distinct() 함수를 이용해서 "is_publish" 키의 고윳값이 [null, 0, 1] 임을 확인했었는데요

오늘 테스트를 위해서 해당 컬렉션에 존재하는 도큐먼트들의 필드 중

"is_publish"의 값을 이미 모두 1로 만들어놨었습니다

 

여기서, 지난 시간 update_one() 함수를 잠깐 복습해보면,

update_one()의 경우에는 조건을 만족하는 도큐먼트가 복수일 경우,

해당 도큐먼트들 중 순서상 최상단의 도큐먼트 하나에만 수정 사항이 반영이 되었습니다

그래서 업데이트에 대한 리턴값 중에서 matched_count는 0 또는 1이였으며,

해당 갱신이 적용된 도큐먼트의 수를 나타내는 modified_count의 값 또한 1을 초과할 수가 없었죠 ^^

 

하지만 update_many() 함수는 해당 조건을 만족하는 모든 도큐먼트들에 대하여

갱신 정보를 반영시키기 때문에 matched_count 값과 modified_count 값으로 2 이상이 허용됩니다

해당 코드를 반영시켜 한 번 확인해보도록 하겠습니다

 

 

 

update_many() 코드가 적용된 API를 호출하기 전,

먼저 find() 함수가 사용된 API를 호출해서 { "is_publish" : 0 } 필터 조건으로 검색해보니

현재 컬렉션에 해당 조건을 만족하는 도큐먼트가 21개라고 합니다

 

그럼 여기서 "is_publish"의 값을 1로 전부 변경시킨 다음,

다시 해당 조건으로 조회했을 때 counts 값이 몇이 나오는지,

또 distinct() 함수를 이용 했을 때 해당 키에 대한 고유값이 무엇들이 나오는지 확인해보도록 하겠습니다 ^^

 

 

 

 

기존의 "is_publish" 값은 0이었고, 해당 조건을 만족하는 도큐먼트는 21개였습니다

update_many() 함수를 통해 이 21개의 도큐먼트 모두

"is_publish" 값을 1로 변경해줬습니다

 

상기 JSON Response 메세지와 같이

해당 조건에 부합한 도큐먼트 21개 모두에 데이터 갱신 작업이 반영 되었습니다

 

upsert=True로 지정해놨어도, 해당 조건을 만족하는 도큐먼트가 이미 존재했기 때문에

별도의 신규 도큐먼트 삽입 작업이 없었으므로 upserted_id는 당연히 None이 리턴되었습니다

 

 

그럼 이제 distinct() 함수와 count_documents() 함수를 이용해서 확인해보겠습니다

 

먼저 distinct() 함수가 기재된 API를 호출해서 조회를 했습니다

"is_publish" 필드를 갖고 있는 도큐먼트들 중에서 0값을 갖고 있는 데이터는 없습니다

따라서 고윳값이 null과 1만 조회가 되네요!

 

 

 

 

그리고 count_documents() 함수가 기재된 API를 호출해서 결과를 확인해보니

"is_publish" 키의 값이 1인 도큐먼트의 총 개수가 21개가 나오네요

 

 

 

 

 

그럼 여기서, update_many() 함수의 upsert 작업의 결과도 궁금하 한 번 확인해볼까요?

#MongoDB Update - update_many() 테스트
class MongoDBUpdateManyResource(Resource):
    def put(self):

        data = request.get_json()

        # 클러스터 접근을 위한 클라이언트 객체 생성
        client = pymongo.MongoClient(Config.MONGO_DB_URI)

        # 컬렉션 정보 저장
        database = client["project-server"]
        collection = database["MongoDB_TEST"]

        # 다중 항목 갱신
        result = collection.update_many(
            {"filter":data['filter']},
            {"$set":{"new_set":data['new_set']}},
            upsert=True
            )

        # 리소스 종료
        client.close()

        return {"acknowledged":result.acknowledged,
                "matched_count":result.matched_count,
                "modified_count":result.modified_count,
                "upserted_id":str(result.upserted_id)}, 200

 

현재 해당 컬렉션에는 "filter"라는 필드를 갖고 있는 도큐먼트는 없습니다

따라서 해당 조건을 만족하는 도큐먼트의 값 곧 matched_count 값은 0이 출력될겁니다

그리고 "new_set" 키와 제가 지정한 임의의 값을 한 쌍으로 필드로 갖는 도큐먼트가 생성 될텐데요

한 번 또 확인해보겠습니다

 

 

 

 

해당 조건에 매칭되는 도큐먼트는 없었습니다

더불어, 해당되는 조건의 도큐먼트가 없었으므로 해당 갱신이 적용되는 도큐먼트 또한 없었습니다

따라서, matched_count와 modified_count의 값은 모두 0입니다

 

하지만 해당 조건의 기존 도큐먼트가 없었으므로 신규 도큐먼트를 생성해 삽입했으므로,

acknowledged의 값은 true이며,

upserted_id으로는 새로 생성된 도큐먼트의 아이디 값이 출력되었습니다

 

 

 

 

클러스터에 접속해서 살펴보니 상기 이미지에서 보다시피,

신규 도큐먼트가 생성된 것을 확인할 수가 있겠습니다 ^^

 

이와 같이 update_many() 함수와 여러 파라미터들을 이용하면

유연하게 데이터 수정 및 갱신이 가능합니다!

보다 자세한 자료는 포스트 상단에 첨부한 레퍼런스 링크를 참고해주시면 되겠습니다 ^.^

 

 

 

 

이번 포스트에서는 update_many()에 대해서 알아보았습니다

다음 포스트에서는 replace_one()에 대해서 살펴보고,

replace_one() 함수와 update_one() 함수는

과연 무슨 차이가 있는지에 대해서도 설명하도록 하겠습니다 ^^

 

읽어주셔서 감사합니다 ^.^