MongoDB에서 문서 내부에 중첩된 배열(하위 속성)의 특정 요소를 제거하려면 $pull 연산자를 사용하면 됩니다. $pull은 지정한 조건과 일치하는 값을 배열에서 자동으로 찾아 삭제해 주는 강력한 업데이트 연산자입니다.
1. 샘플 컬렉션 생성하기
먼저 실습을 위해 문서가 포함된 컬렉션을 생성해 보겠습니다.
> db.demo388.insertOne(
... {
... _id: '101',
... userDetails: {
... isMarried: false,
... userInfo: [
... {
... Name: "Chris",
... Age: 21
... }
... ]
... }
... }
... );
{ "acknowledged" : true, "insertedId" : "101" }2. 컬렉션의 모든 문서 조회하기
find() 메서드를 사용하여 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.demo388.find();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : "101", "userDetails" : { "isMarried" : false, "userInfo" : [ { "Name" : "Chris", "Age" : 21 } ] } }현재 userDetails.userInfo라는 하위 속성 배열 안에 Name이 "Chris"인 객체가 하나 들어있는 상태입니다.
3. $pull로 하위 속성 배열의 요소 제거하기
다음은 중첩된 배열에서 특정 요소를 제거하는 쿼리입니다. 점 표기법(dot notation)으로 userDetails.userInfo 경로를 지정하고, 제거할 조건을 $pull에 전달합니다.
> db.demo388.update(
... { "_id": "101" },
... { "$pull": { "userDetails.userInfo": { "Name":"Chris" } } }
... })
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })실행 결과를 보면 nModified : 1로 표시되어, 하나의 문서가 성공적으로 수정되었음을 알 수 있습니다.
4. 제거 후 결과 확인하기
다시 find() 메서드로 전체 문서를 조회해 보겠습니다.
> db.demo388.find();
실행 결과는 다음과 같습니다.
{ "_id" : "101", "userDetails" : { "isMarried" : false, "userInfo" : [ ] } }Name이 "Chris"였던 요소가 배열에서 완전히 제거되어 userInfo가 빈 배열 [ ]이 된 것을 확인할 수 있습니다.
핵심 정리
- $pull 연산자: 조건과 일치하는 배열 요소를 제거할 때 사용합니다.
- 점 표기법: 중첩된 필드에 접근할 때는
상위필드.하위필드형태로 경로를 지정합니다. - 조건 매칭: $pull에 전달한 객체와 일치하는 모든 배열 요소가 한 번에 제거됩니다.
- update() 대체: 최신 MongoDB 버전에서는
updateOne()또는updateMany()사용을 권장합니다.