Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB에서 문서의 특정 데이터 삭제하기 – $unset 연산자 사용법

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 연산자를 활용하면 문서에서 불필요한 필드를 간단하고 안전하게 제거할 수 있습니다.