-
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로 바꿔줘 라는 쿼리 문이 완성되었다.인터넷을 검색하며 찾아보고 위키와 블로그를 읽어보며 작성 한글입니다. 혹시라도 부정확한 정보를 전달드릴수 있습니다. 틀린 부분이 있으면 댓글을 남겨주세요.
'공부 > Database' 카테고리의 다른 글
[SQL] FK를 이용하여 여러 Row data를 컬럼과 값으로 Group by 하려면..... (0) 2024.02.27 반복 일정 설계 (0) 2023.07.03 ORM(Object Relational Mapping) (0) 2021.12.24 MySQL 데이터 추가, 수정, 삭제 (0) 2021.09.01 SQL , SQL 명령어, 데이터베이스 명령어, ACID (0) 2021.08.27