MongoDB에서 배열 요소를 제거하는 방법: $pull 연산자
MongoDB에서 $addToSet은 배열에 중복 없이 값을 추가하는 연산자입니다. 그렇다면 그 반대인 '$removeFromSet'처럼 배열에서 특정 값을 제거하려면 어떻게 해야 할까요? 정답은 바로 $pull 연산자를 사용하는 것입니다.
$pull 연산자는 지정한 조건과 일치하는 모든 값을 배열에서 제거해 줍니다. 이번 글에서는 실제 예제를 통해 $pull의 사용법을 단계별로 살펴보겠습니다.
1. 테스트 컬렉션 생성
먼저 문서가 포함된 컬렉션을 생성합니다. 아래 쿼리는 학생 이름과 취미 목록을 담은 컬렉션을 만드는 예제입니다.
> db.oppositeAddToSetDemo.insertOne({"StudentName":"John","StudentHobby":["Cricket","Cooking","Drawing"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c8eddcc2f684a30fbdfd588")
}
> db.oppositeAddToSetDemo.insertOne({"StudentName":"Carol","StudentHobby":["Cricket","Dance","Hiking"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c8eddfd2f684a30fbdfd589")
}
> db.oppositeAddToSetDemo.insertOne({"StudentName":"David","StudentHobby":["Learning","Photography"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c8ede272f684a30fbdfd58a")
}2. 저장된 문서 확인하기
find() 메서드와 pretty()를 함께 사용하면 컬렉션의 모든 문서를 보기 좋게 출력할 수 있습니다.
> db.oppositeAddToSetDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c8eddcc2f684a30fbdfd588"),
"StudentName" : "John",
"StudentHobby" : [
"Cricket",
"Cooking",
"Drawing"
]
}
{
"_id" : ObjectId("5c8eddfd2f684a30fbdfd589"),
"StudentName" : "Carol",
"StudentHobby" : [
"Cricket",
"Dance",
"Hiking"
]
}
{
"_id" : ObjectId("5c8ede272f684a30fbdfd58a"),
"StudentName" : "David",
"StudentHobby" : [
"Learning",
"Photography"
]
}3. $pull로 배열 요소 제거하기
이제 $pull 연산자를 사용해 John의 취미 목록에서 'Cooking' 항목을 제거해 보겠습니다. 이것이 바로 $addToSet의 반대 동작에 해당합니다.
> db.oppositeAddToSetDemo.update(
... {"StudentName": "John"},
... {$pull: { "StudentHobby": "Cooking"}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })결과 메시지를 보면 nMatched: 1(조건에 일치한 문서 1개), nModified: 1(실제 수정된 문서 1개)로 정상적으로 업데이트가 수행되었음을 확인할 수 있습니다.
4. 업데이트 결과 검증
다시 find() 메서드로 컬렉션의 문서를 조회하여 변경 사항을 확인해 보겠습니다.
> db.oppositeAddToSetDemo.find().pretty();
출력 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c8eddcc2f684a30fbdfd588"),
"StudentName" : "John",
"StudentHobby" : [
"Cricket",
"Drawing"
]
}
{
"_id" : ObjectId("5c8eddfd2f684a30fbdfd589"),
"StudentName" : "Carol",
"StudentHobby" : [
"Cricket",
"Dance",
"Hiking"
]
}
{
"_id" : ObjectId("5c8ede272f684a30fbdfd58a"),
"StudentName" : "David",
"StudentHobby" : [
"Learning",
"Photography"
]
}위 결과에서 확인할 수 있듯이, John의 StudentHobby 배열에서 'Cooking' 항목이 성공적으로 제거되었습니다.
$pull 연산자의 추가 기능
$pull은 단순히 특정 값 하나만 제거하는 데 그치지 않고 다양한 방식으로 활용할 수 있습니다.
- 조건 기반 제거: 쿼리 연산자(예:
$gte,$in)를 사용하여 특정 조건에 맞는 여러 값을 한 번에 제거할 수 있습니다. - 중복 값 일괄 삭제: 배열 내에 동일한 값이 여러 개 있어도 해당 값이 모두 제거됩니다.
- 내장 문서 제거: 객체 형태의 배열 요소도 필드 조건을 지정하여 제거할 수 있습니다.
예를 들어, 점수 배열에서 80점 미만의 모든 값을 제거하려면 다음과 같이 작성할 수 있습니다.
> db.students.update(
... { _id: 1 },
... { $pull: { scores: { $lt: 80 } } }
... );마무리
MongoDB에서 $addToSet의 반대 동작, 즉 배열에서 요소를 제거하고 싶다면 $pull 연산자를 사용하면 됩니다. 간단한 값 제거부터 조건 기반 대량 삭제까지 유연하게 처리할 수 있어 배열 데이터 관리에 매우 유용한 도구입니다.