※ 참고자료 ※
PyMongo 4.8.0 Documentation Reference Link
https://pymongo.readthedocs.io/en/stable/index.html
반갑습니다!
저번 포스트에서 update_one()에 대해서 알아보았습니다
이번에는 데이터 갱신의 나머지 함수들인
update_many()와 replace_one()에 대해서 나눠보겠습니다
그리고 그 이후에 도큐먼트의 변경 사항을
모니터링하는 부분에 대해서 살펴보도록 하겠습니다
일전에 예시용으로 생성해둔 더미 데이터들 중에서 "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 작업의 결과도 궁금하 한 번 확인해볼까요?
현재 해당 컬렉션에는 "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() 함수는
과연 무슨 차이가 있는지에 대해서도 설명하도록 하겠습니다 ^^
읽어주셔서 감사합니다 ^.^