MongoDB에서 배열에 저장된 요소, 즉 내장 문서(embedded document)를 제거하고 싶다면 $pull 연산자를 사용하면 됩니다. 이 글에서는 실제 예제를 통해 $pull 연산자의 사용법을 단계별로 살펴보겠습니다.
1. 테스트용 컬렉션 생성하기
먼저 학생 정보를 담고 있는 배열 필드를 포함한 문서로 컬렉션을 생성해 보겠습니다.
> db.pullAnArrayElementDemo.insertOne(
{
"StudentDetails": [
{ "StudentFirstName": "Chris", "StudentScore": 56 },
{ "StudentFirstName": "Robert", "StudentScore": 59 }
]
}
);
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd3b55bedc6604c74817cd5")
}2. 현재 저장된 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.
> db.pullAnArrayElementDemo.find().pretty();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : ObjectId("5cd3b55bedc6604c74817cd5"),
"StudentDetails" : [
{
"StudentFirstName" : "Chris",
"StudentScore" : 56
},
{
"StudentFirstName" : "Robert",
"StudentScore" : 59
}
]
}현재 StudentDetails 배열 안에 Chris와 Robert 두 개의 학생 문서가 들어있는 것을 확인할 수 있습니다.
3. $pull 연산자로 배열 요소 제거하기
이제 $pull 연산자를 사용해 배열에서 특정 조건에 맞는 요소(문서)를 제거해 보겠습니다. 여기서는 이름이 'Chris'인 학생 문서를 삭제합니다.
> db.pullAnArrayElementDemo.update(
{},
{ $pull: { 'StudentDetails': { 'StudentFirstName': 'Chris' } } }
);
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })nModified : 1이 반환되었으므로, 하나의 문서에서 해당 배열 요소가 성공적으로 제거된 것입니다.
$pull 연산자 동작 원리: $pull은 지정한 조건과 일치하는 모든 배열 요소를 한 번에 제거합니다. 조건 객체가 일치하려면 배열 내 문서의 필드 값이 정확히 일치해야 하며, 부분 일치만으로는 제거되지 않습니다.
4. 삭제 후 결과 확인하기
변경 사항이 정상적으로 적용되었는지 다시 한번 전체 문서를 조회해 보겠습니다.
> db.pullAnArrayElementDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5cd3b55bedc6604c74817cd5"),
"StudentDetails" : [
{
"StudentFirstName" : "Robert",
"StudentScore" : 59
}
]
}'Chris'에 해당하는 배열 요소가 사라지고 'Robert' 문서만 남아 있는 것을 확인할 수 있습니다.
정리
MongoDB에서 배열 내부의 문서 요소를 제거할 때는 $pull 연산자가 가장 간단하고 직관적인 방법입니다. 핵심 문법은 다음과 같습니다.
db.컬렉션명.update(
{ 검색조건 },
{ $pull: { "배열필드명": { "제거할_필드": "값" } } }
)참고로 최신 MongoDB 버전에서는 update() 대신 updateOne(), updateMany() 메서드를 사용하는 것이 권장됩니다. 또한 조건에 정규식이나 비교 연산자($gt, $lt 등)를 함께 사용하면 더욱 유연하게 배열 요소를 제거할 수 있습니다.