MongoDB에서 특정 필드와 그 값을 삭제하고 싶다면 $unset 연산자를 사용하면 됩니다. 이 글에서는 실제 예제를 통해 $unset 연산자로 문서에서 필드를 제거하는 방법을 단계별로 살펴보겠습니다.
1. 테스트용 컬렉션 생성하기
먼저 insertOne() 메서드를 사용하여 문서가 포함된 컬렉션을 생성합니다.
> db.deleteFieldDemo.insertOne({"FirstName":"John","LastName":"Smith"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cb9fb767219729fde21ddad")
}
> db.deleteFieldDemo.insertOne({"FirstName":"David","LastName":"Miller"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cb9fb837219729fde21ddae")
}
> db.deleteFieldDemo.insertOne({"FirstName":"Carol","LastName":"Taylor"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cb9fb8d7219729fde21ddaf")
}2. 현재 저장된 문서 확인하기
다음은 find() 메서드를 사용하여 컬렉션의 모든 문서를 조회하는 쿼리입니다.
> db.deleteFieldDemo.find().pretty();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : ObjectId("5cb9fb767219729fde21ddad"),
"FirstName" : "John",
"LastName" : "Smith"
}
{
"_id" : ObjectId("5cb9fb837219729fde21ddae"),
"FirstName" : "David",
"LastName" : "Miller"
}
{
"_id" : ObjectId("5cb9fb8d7219729fde21ddaf"),
"FirstName" : "Carol",
"LastName" : "Taylor"
}현재 세 개의 문서 모두 FirstName과 LastName 필드를 포함하고 있는 것을 확인할 수 있습니다.
3. $unset 연산자로 필드 삭제하기
이제 $unset 연산자를 사용하여 모든 문서에서 FirstName 필드와 해당 값을 삭제해 보겠습니다.
> db.deleteFieldDemo.update(
... { FirstName: { $exists: true } },
... { $unset: { FirstName: 1 } },
... false,
... true
... );
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 3 })쿼리의 각 부분을 자세히 살펴보겠습니다.
- { FirstName: { $exists: true } }: FirstName 필드가 존재하는 문서만 대상으로 지정합니다.
- { $unset: { FirstName: 1 } }: FirstName 필드를 문서에서 제거합니다. 여기서 값(1)은 어떤 값을 넣어도 무시되며, 필드의 존재 여부에만 의미가 있습니다.
- false: upsert 옵션으로, 조건에 맞는 문서가 없을 경우 새 문서를 생성하지 않습니다.
- true: multi 옵션으로, 조건에 일치하는 모든 문서에 업데이트를 적용합니다.
실행 결과 nModified: 3으로 표시되어, 세 개의 문서가 모두 성공적으로 수정되었음을 알 수 있습니다.
참고: MongoDB 3.2 이상 버전에서는 updateMany() 메서드를 사용하여 더 간결하게 작성할 수 있습니다. db.deleteFieldDemo.updateMany({}, { $unset: { FirstName: 1 } })
4. 삭제 결과 확인하기
FirstName 필드가 컬렉션에서 실제로 삭제되었는지 다시 한번 조회하여 확인해 보겠습니다.
> db.deleteFieldDemo.find().pretty();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5cb9fb767219729fde21ddad"), "LastName" : "Smith" }
{ "_id" : ObjectId("5cb9fb837219729fde21ddae"), "LastName" : "Miller" }
{ "_id" : ObjectId("5cb9fb8d7219729fde21ddaf"), "LastName" : "Taylor" }모든 문서에서 FirstName 필드가 사라지고 _id와 LastName 필드만 남은 것을 확인할 수 있습니다.
정리
MongoDB에서 필드를 삭제할 때는 $unset 연산자를 사용합니다. 주요 포인트는 다음과 같습니다.
$unset은 필드 자체를 문서에서 완전히 제거합니다(값을 null로 설정하는 것과 다릅니다).- 여러 문서에 적용하려면 multi 옵션(
true) 또는updateMany()를 반드시 사용해야 합니다. $exists: true조건을 함께 사용하면 해당 필드가 있는 문서만 정확히 대상으로 지정할 수 있습니다.