MongoDB에서 배열의 특정 위치에 있는 요소(n번째 요소)를 삭제하려면 $unset 연산자와 $pull 연산자를 업데이트 쿼리와 함께 사용하면 됩니다. 두 연산자의 역할은 다음과 같습니다.
- $unset: 지정한 필드 또는 배열 요소의 값을 제거합니다. 배열 요소에 적용하면 해당 자리가
null로 대체됩니다. - $pull: 배열에서 조건과 일치하는 값을 완전히 삭제합니다. 여기서는 $unset으로 생긴
null값을 정리하는 용도로 사용됩니다.
그럼 실제 예제를 통해 단계별로 살펴보겠습니다.
1단계: 문서가 포함된 컬렉션 생성
먼저 테스트에 사용할 컬렉션을 만들고 문서를 삽입합니다. 쿼리는 다음과 같습니다.
> db.getNThElementDemo.insertOne({"UserName":"John","UserAge":23,"ListOfFriends":["Carol","Sam","Mike","Bob"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c94ee7516f542d757e2b43e")
}
> db.getNThElementDemo.insertOne({"UserName":"David","UserAge":21,"ListOfFriends":["Chris","Robert"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c94eeaa16f542d757e2b43f")
}2단계: find()로 전체 문서 확인
find() 메서드를 사용하면 컬렉션의 모든 문서를 조회할 수 있습니다.
> db.getNThElementDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c94ee7516f542d757e2b43e"),
"UserName" : "John",
"UserAge" : 23,
"ListOfFriends" : [
"Carol",
"Sam",
"Mike",
"Bob"
]
}
{
"_id" : ObjectId("5c94eeaa16f542d757e2b43f"),
"UserName" : "David",
"UserAge" : 21,
"ListOfFriends" : [
"Chris",
"Robert"
]
}3단계: $unset과 $pull로 n번째 요소 삭제
배열의 n번째 요소를 삭제하는 쿼리는 다음과 같습니다. 먼저 $unset으로 세 번째 요소(인덱스 2)의 값을 제거한 뒤, $pull로 배열에 남은 null 값을 완전히 빼냅니다.
> db.getNThElementDemo.update({}, {$unset : {"ListOfFriends.2" : 1 }});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.getNThElementDemo.update({}, {$pull : {"ListOfFriends" : null}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })4단계: 삭제 결과 확인
다시 find() 메서드를 실행하면 n번째 요소가 실제로 제거되었는지 확인할 수 있습니다.
> db.getNThElementDemo.find().pretty();
실행 결과는 다음과 같습니다. John의 친구 목록에서 세 번째 요소였던 "Mike"가 사라진 것을 볼 수 있습니다.
{
"_id" : ObjectId("5c94ee7516f542d757e2b43e"),
"UserName" : "John",
"UserAge" : 23,
"ListOfFriends" : [
"Carol",
"Sam",
"Bob"
]
}
{
"_id" : ObjectId("5c94eeaa16f542d757e2b43f"),
"UserName" : "David",
"UserAge" : 21,
"ListOfFriends" : [
"Chris",
"Robert"
]
}정리
MongoDB에서 배열의 n번째 요소를 삭제하려면 $unset으로 해당 인덱스의 값을 제거한 후, $pull로 null 값을 배열에서 제거하는 두 단계를 거치면 됩니다. 참고로 최신 MongoDB 버전에서는 updateOne()/updateMany() 메서드 사용이 권장되며, 조건 없이 모든 문서에 적용하려면 빈 필터 {}를 전달하면 됩니다.