MongoDB에서 배열(하위 컬렉션)에 포함된 특정 객체를 제거하려면 $pull 연산자를 사용해야 합니다. $pull은 지정한 조건과 일치하는 요소를 배열에서 자동으로 삭제해 주는 강력한 업데이트 연산자입니다.
1. 테스트 컬렉션 생성 및 문서 삽입
먼저 예제에 사용할 컬렉션을 만들고 문서를 삽입해 보겠습니다. insertOne() 메서드를 사용합니다.
> db.demo715.insertOne({
... _id: 1,
... details : [
... { 'id' : '101',
... 'Information' : [
... {
... 'studentid' : '102',
... "Name" : "Bob"
... },
... {
... 'studentid' : '103',
... "Name" : "Chris"
... }
... ]
... }
... ]
... });
{ "acknowledged" : true, "insertedId" : 1 }위 명령이 성공적으로 실행되면 acknowledged: true와 함께 삽입된 문서의 ID가 반환됩니다.
2. 삽입된 문서 확인하기
find() 메서드를 사용하여 컬렉션의 모든 문서를 조회할 수 있습니다.
> db.demo715.find();
실행 결과는 다음과 같습니다.
{ "_id" : 1, "details" : [ { "id" : "101", "Information" : [ { "studentid" : "102", "Name" : "Bob" }, { "studentid" : "103", "Name" : "Chris" } ] } ] }현재 Information 배열에는 studentid가 '102'인 Bob과 '103'인 Chris 두 개의 객체가 들어 있습니다.
3. $pull을 사용하여 하위 배열의 객체 제거
이제 update()> 메서드와 $pull 연산자를 조합하여, details 배열 중 id가 '101'인 항목의 Information 배열에서 특정 학생 객체를 제거해 보겠습니다. 이때 위치 연산자 $를 사용하여 일치하는 배열 요소를 정확히 지정합니다.
> db.demo715.update(
... { "details.id": '101' },
... { $pull: { 'details.$.Information': { studentid: '102', "Name": "Bob" } } }
... );
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
결과를 보면 nMatched: 1, nModified: 1로, 하나의 문서가 성공적으로 수정되었음을 확인할 수 있습니다.
4. 삭제 후 결과 확인
다시 find() 메서드로 문서를 조회하여 객체가 실제로 제거되었는지 확인합니다.
> db.demo715.find();
실행 결과는 다음과 같습니다.
{ "_id" : 1, "details" : [ { "id" : "101", "Information" : [ { "studentid" : "103", "Name" : "Chris" } ] } ] }출력 결과를 보면 studentid가 '102'이고 이름이 'Bob'인 객체가 배열에서 완전히 제거되고, Chris의 정보만 남아 있는 것을 확인할 수 있습니다.
정리
MongoDB에서 중첩된 배열 안의 특정 객체를 삭제할 때는 다음 단계를 기억하면 됩니다.
- 조건 쿼리로 수정 대상이 되는 상위 배열 요소를 찾습니다.
- $pull 연산자와 위치 연산자
$를 사용하여 하위 배열에서 제거할 객체를 지정합니다. find()로 결과를 검증하여 변경 사항을 확인합니다.
참고로 최신 MongoDB 버전에서는 update() 대신 updateOne() 또는 updateMany() 사용이 권장되며, 동작 방식은 동일하게 적용됩니다.