MongoDB에서 객체 배열 내부에 중첩된 문자열 배열 업데이트하기
MongoDB에서는 객체 배열 안에 문자열 배열이 다시 중첩된 형태의 데이터 구조를 자주 접하게 됩니다. 이렇게 깊이 중첩된 배열에서 특정 값을 제거하려면 $pull 연산자와 모든 위치 연산자($[])를 함께 사용하는 것이 가장 효과적입니다. 이번 글에서는 실제 예제를 통해 그 과정을 단계별로 살펴보겠습니다.
1단계: 컬렉션 생성 및 문서 삽입
먼저 문서를 담고 있는 컬렉션을 생성해 보겠습니다.
> db.demo412.insertOne(
... {
... "Information1" : [
... {
... "Information2" : [
... "John",
... "David"
... ]
... },
... {
... "Information2" : [
... "Mike"
... ]
... }
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e70f38b15dc524f70227683")
}
2단계: find() 메서드로 문서 조회
find() 메서드를 사용하면 컬렉션의 모든 문서를 확인할 수 있습니다.
> db.demo412.find();
위 명령을 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5e70f38b15dc524f70227683"), "Information1" : [ { "Information2" : [ "John", "David" ] }, { "Information2" : [ "Mike" ] } ] }3단계: $pull과 $[] 연산자로 중첩 배열 업데이트
다음은 MongoDB에서 객체 배열 내부에 중첩된 문자열 배열을 업데이트하는 쿼리입니다. 여기서는 Information2 배열에서 "Mike"라는 값을 제거해 보겠습니다.
> db.demo412.updateMany(
... { _id: ObjectId("5e70f38b15dc524f70227683") },
... { $pull : {'Information1.$[].Information2' : "Mike" } }
... );
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
쿼리의 핵심 요소를 살펴보면 다음과 같습니다.
- $pull: 지정한 조건과 일치하는 요소를 배열에서 제거합니다.
- $[](모든 위치 연산자): Information1 배열의 모든 객체 요소에 업데이트를 적용합니다. 이 연산자가 없으면 첫 번째로 일치하는 요소만 처리되므로 주의해야 합니다.
4단계: 업데이트 결과 확인
find() 메서드로 다시 문서를 조회하여 변경 사항을 확인합니다.
> db.demo412.find();
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e70f38b15dc524f70227683"), "Information1" : [ { "Information2" : [ "John", "David" ] }, { "Information2" : [ ] } ] }출력 결과를 보면 두 번째 객체의 Information2 배열에서 "Mike"가 성공적으로 제거되어 빈 배열이 된 것을 확인할 수 있습니다. 이처럼 $pull과 $[] 연산자를 조합하면 깊게 중첩된 배열 구조도 단 한 번의 쿼리로 손쉽게 업데이트할 수 있습니다.