MongoDB 배열에서 여러 객체 제거하기 ($pull 연산자)
MongoDB에서 배열 안에 저장된 여러 객체를 한 번에 제거하려면 $pull 연산자를 사용하면 됩니다. $pull은 지정한 조건과 일치하는 모든 요소를 배열에서 삭제하는 업데이트 연산자입니다. 특히 $in 연산자와 함께 사용하면 여러 값을 하나의 쿼리로 동시에 제거할 수 있어 매우 편리합니다.
1. 예제 컬렉션 생성
먼저 테스트용으로 사용할 문서를 포함한 컬렉션을 생성합니다.
> db.pullMultipleObjectsDemo.insertOne(
... {
... "ClientId" : "100",
... "ClientName" : "John",
... "ClientPersonalDetails" : [
... {
... "ClientCountryName" : "US",
... "ClientProjectName" : "Online Book Store"
... },
... {
... "ClientCountryName" : "AUS",
... "ClientProjectName" : "Online Fee Management"
... },
... {
... "ClientCountryName" : "UK",
... "ClientProjectName" : "Online Pig Dice Game"
... },
... {
... "ClientCountryName" : "ANGOLA",
... "ClientProjectName" : "Online Hospital Management"
... }
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5cc7d0748f9e6ff3eb0ce43d")
}
위 문서에는 ClientPersonalDetails라는 배열 필드가 있으며, 국가명과 프로젝트명을 담은 객체 4개가 들어 있습니다.
2. 전체 문서 조회
find() 메서드를 사용해 컬렉션의 모든 문서를 확인합니다.
> db.pullMultipleObjectsDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5cc7d0748f9e6ff3eb0ce43d"),
"ClientId" : "100",
"ClientName" : "John",
"ClientPersonalDetails" : [
{
"ClientCountryName" : "US",
"ClientProjectName" : "Online Book Store"
},
{
"ClientCountryName" : "AUS",
"ClientProjectName" : "Online Fee Management"
},
{
"ClientCountryName" : "UK",
"ClientProjectName" : "Online Pig Dice Game"
},
{
"ClientCountryName" : "ANGOLA",
"ClientProjectName" : "Online Hospital Management"
}
]
}
3. $pull과 $in으로 여러 객체 동시 제거
이제 $pull 연산자에 $in 조건을 조합하여 "Online Book Store"와 "Online Pig Dice Game" 프로젝트 객체 두 개를 한 번의 업데이트로 제거합니다.
> db.pullMultipleObjectsDemo.update(
... {"_id": ObjectId("5cc7d0748f9e6ff3eb0ce43d")},
... {"$pull":{"ClientPersonalDetails":{"ClientProjectName":{$in:["Online Book Store","Online Pig Dice Game"]}}}}
... );
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
nModified : 1이 반환되었다면 하나의 문서가 성공적으로 수정된 것입니다.
4. 결과 확인
객체가 실제로 배열에서 제거되었는지 다시 전체 문서를 조회해 확인합니다.
> db.pullMultipleObjectsDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5cc7d0748f9e6ff3eb0ce43d"),
"ClientId" : "100",
"ClientName" : "John",
"ClientPersonalDetails" : [
{
"ClientCountryName" : "AUS",
"ClientProjectName" : "Online Fee Management"
},
{
"ClientCountryName" : "ANGOLA",
"ClientProjectName" : "Online Hospital Management"
}
]
}
출력 결과를 보면 ClientPersonalDetails 배열에서 지정한 두 객체가 정상적으로 제거되고, 나머지 두 개의 객체만 남아 있는 것을 확인할 수 있습니다.
정리
$pull 연산자는 배열에서 조건에 일치하는 요소를 제거할 때 사용하며, $in과 결합하면 여러 객체를 한 번의 업데이트로 손쉽게 처리할 수 있습니다. 참고로 최신 MongoDB 버전(4.2 이상)에서는 deprecated된 update() 대신 updateOne() 또는 updateMany() 메서드 사용이 권장됩니다.