MongoDB에서 문서 내부의 객체나 특정 필드를 삭제하려면 $unset 연산자를 사용하면 됩니다. 이 글에서는 실제 예제를 통해 $unset의 사용 방법을 단계별로 살펴보겠습니다.
1. 샘플 컬렉션 생성 및 데이터 삽입
먼저 insertOne() 메서드를 사용해 demo348 컬렉션에 두 개의 문서를 삽입합니다.
> db.demo348.insertOne(
... {
... "details": {
... "studentDetails":
... {
... StudentName: "Robert"
... }
... }
...
... });
{
"acknowledged" : true,
"insertedId" : ObjectId("5e553556f8647eb59e5620b2")
}
> db.demo348.insertOne(
... {
... "details": {
... "studentDetails":
... {
... StudentName: "Mike"
... }
... }
...
... });
{
"acknowledged" : true,
"insertedId" : ObjectId("5e553563f8647eb59e5620b3")
}2. 삽입된 문서 확인하기
find() 메서드를 사용하면 컬렉션의 모든 문서를 조회할 수 있습니다.
> db.demo348.find();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5e553556f8647eb59e5620b2"), "details" : { "studentDetails" : { "StudentName" : "Robert" } } }
{ "_id" : ObjectId("5e553563f8647eb59e5620b3"), "details" : { "studentDetails" : { "StudentName" : "Mike" } } }3. $unset으로 객체 제거하기
이제 details.studentDetails 객체를 제거하는 쿼리를 실행해 보겠습니다. 조건을 빈 객체({})로 지정하고 multi 옵션을 true로 설정하면 컬렉션 내 모든 문서에 일괄 적용됩니다.
> db.demo348.update({},{$unset: { "details.studentDetails": ""}},{multi: true});
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })결과에서 nModified 값이 2로 표시된 것을 통해 두 개의 문서가 모두 정상적으로 수정되었음을 확인할 수 있습니다. 참고로 최신 버전의 MongoDB에서는 동일한 작업을 수행할 때 updateMany() 메서드를 사용하는 것이 권장됩니다.
4. 제거 결과 확인
다시 find() 메서드로 전체 문서를 조회해 보겠습니다.
> db.demo348.find();
실행 결과, 각 문서에서 studentDetails 객체가 완전히 제거되고 details 필드만 빈 상태로 남아 있는 것을 확인할 수 있습니다.
{ "_id" : ObjectId("5e553556f8647eb59e5620b2"), "details" : { } }
{ "_id" : ObjectId("5e553563f8647eb59e5620b3"), "details" : { } }이처럼 $unset 연산자는 해당 필드의 값을 지정된 값으로 변경하는 것이 아니라, 필드 자체를 문서에서 완전히 삭제한다는 점을 기억하면 됩니다. 중첩된 객체나 하위 필드도 도트 표기법(dot notation)을 사용하면 손쉽게 제거할 수 있습니다.