MongoDB에서 문서에 포함된 특정 필드나 데이터를 삭제하려면 $unset 연산자를 사용하면 됩니다. $unset은 해당 필드의 값을 비우는 것이 아니라, 문서에서 필드 자체를 완전히 제거하는 역할을 합니다. 아래에서 단계별로 그 사용 방법을 살펴보겠습니다.
1단계: 샘플 컬렉션 생성
먼저 insertOne() 메서드를 사용하여 테스트용 문서가 담긴 컬렉션을 생성합니다.
> db.demo20.insertOne(
... {
... "ListOfEmployee" : [
... {
... "EmployeeName1" : "John"
... },
... {
... "EmployeeName2" : "Carol"
... }
... ],
... "EmployeeName2" : []
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e138c3555d0fc6657d21f12")
}
위 명령이 성공적으로 실행되면 demo20이라는 컬렉션이 생성되고, 직원 목록 배열과 빈 배열 형태의 EmployeeName2 필드를 가진 문서 하나가 저장됩니다.
2단계: 전체 문서 조회
find() 메서드를 사용하여 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.demo20.find();
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e138c3555d0fc6657d21f12"), "ListOfEmployee" : [ { "EmployeeName1" : "John" }, { "EmployeeName2" : "Carol" } ], "EmployeeName2" : [ ] }
현재 문서에는 최상위 레벨의 EmployeeName2 필드(빈 배열)가 존재하는 것을 확인할 수 있습니다.
3단계: $unset으로 특정 데이터 삭제
이제 update() 메서드와 함께 $exists 조건 및 $unset 연산자를 사용하여 해당 필드를 제거합니다.
> db.demo20.update({ "EmployeeName2": { "$exists": 1 }},{ "$unset": { "EmployeeName2": "" } });
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
여기서 각 부분의 의미는 다음과 같습니다.
- { "EmployeeName2": { "$exists": 1 } } –
EmployeeName2필드가 존재하는 문서만 대상으로 지정합니다. - { "$unset": { "EmployeeName2": "" } } – 해당 필드를 문서에서 완전히 삭제합니다. 값으로 지정한 빈 문자열은 실제 저장되지 않습니다.
- nMatched : 1, nModified : 1 – 한 개의 문서가 조건에 일치했고, 실제로 수정되었음을 의미합니다.
4단계: 삭제 결과 확인
다시 find() 메서드를 실행하여 변경 사항을 확인해 보겠습니다.
> db.demo20.find();
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e138c3555d0fc6657d21f12"), "ListOfEmployee" : [ { "EmployeeName1" : "John" }, { "EmployeeName2" : "Carol" } ] }
출력 결과를 보면 최상위 레벨의 EmployeeName2 필드가 더 이상 존재하지 않는 것을 확인할 수 있습니다. 반면 ListOfEmployee 배열 내부의 데이터는 그대로 유지됩니다.
참고 사항
- $unset은 필드 자체를 제거합니다. 값을 null이나 빈 값으로 바꾸는 것이 아니라, 스키마에서 해당 키 자체가 사라집니다.
- 최신 MongoDB 버전에서는 updateOne() 또는 updateMany() 사용을 권장합니다. 기존의
update()메서드는 더 이상 권장되지 않으며(deprecated), 여러 문서를 수정하려면updateMany()를 사용해야 합니다. - 배열 내부 요소 삭제 시에는 $pull 또는 위치 연산자($ , $[])를 활용하는 것이 적절합니다. $unset을 배열 인덱스에 사용하면 해당 요소가 null로 대체될 수 있으므로 주의가 필요합니다.
이처럼 MongoDB에서는 $unset 연산자를 활용하면 문서에서 불필요한 필드를 간단하고 안전하게 제거할 수 있습니다.