ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • MongoDB - 배열 식별자를 통한 다중 update(feat.arrayFilters)
    공부/Database 2022. 10. 24. 20:34

    MongoDB에서 특정 조건에 맞는 유저의 모든 데이터를 false에서 true로 바꾸고 싶었다.

     

    여러 가지 검색을 해보면 updateMany를 쓰라고 되어있거나, bulkwrite를 쓰라고 되어있는데,

     

    1. updateMany로 아무리 실행을 해도 되지 않았다. 물론, 내가 잘 못했을 가능성이 높다.

     

    2. bulkwrite는 순차적으로 진행한다고 생각을 했기 때문에 해당 방법은 내가 원하는 방법이 아니었다.

     

    많은 검색과 다양한 시도 끝에 내가 해결한 방법은 arrayFilters를 사용하는 방법이다.
    공식문서: https://www.mongodb.com/docs/manual/reference/operator/update/positional-filtered/

     

    공식문서에도 잘 설명돼 있지만, 나는 다른 사람의 블로그를 참고하였다.

    참고 블로그: https://devyeogoo.tistory.com/3

     

    우선, 내가 푼 방식과 내 저장된 데이터를 보자.

    많은 필드들을 지웠다. 남은 필드로도 충분할 거 같다.

    우선 내 경우 안됐던 이유가 push_alarm_list라는 필드 안에

    배열(array)로 데이터가 존재하고 0번째 인덱스의 값은 객체(object)로 존재하고 있다.

     

    이런 경우 updateMany를 하였지만 지속적으로 하나의 값만 업데이트될 뿐이었다.

    updatemany 예시 코드

    User.updateMany(
            {
                _id: _id,  # 조건 영역
                "push_alarm_list.is_read": false
            },
            {
                $set: {"push_alarm_list.$.is_read": true} # 변경 영역
            },
            {
                "multi": true # 설정 영역
            }
        ).exec()

     

    내가 원하는 조건 = 유저의 id로 조회 후 push_alarm_list.is_read가 false면  true로 바꿔줘

     

    1개의 값만 업데이트가 되었던 문제는 조건에도 있겠지만  array 부분도 문제라고 생각을 했고

    코드를 수정해보았다.

    update 예시 코드(arrayFilters사용)

    User.update(
            {
                _id: _id,
            },
            {
                $set: {"push_alarm_list.$[message].is_read": true}
            },
            {
                multi: true,
                arrayFilters:[{"message.is_read": false}]
            }
        ).exec()
    }

    _id로 찾고 
    $set으로 요청한 부분이다.

    arrayFilters를 사용할 경우 꼭 set에서 [message]를 선언해줘야 한다. (message는 어떤 단어든 상관없다.)

    message로 입력 후 arrayFilters에서 message.is_read로 다시 조건을 설정해줘야 한다.

     

    다시 정리하자면,
    id로 유저를 찾고 배열 안에 값 중 is_read가 false인 값을 모두 true로 바꿔줘 라는 쿼리 문이 완성되었다.

     

     

     

    인터넷을 검색하며 찾아보고 위키와 블로그를 읽어보며 작성 한글입니다. 혹시라도 부정확한 정보를 전달드릴수 있습니다. 틀린 부분이 있으면 댓글을 남겨주세요.

     

    댓글

Designed by Tistory.