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

MongoDB 컬렉션에서 특정 문서 하나만 남기고 나머지 모든 문서 삭제하기

MongoDB에서 컬렉션에 저장된 여러 문서 중 단 하나의 문서만 남기고 나머지를 모두 삭제해야 하는 경우가 종종 있습니다. 이럴 때는 remove() 메서드에 적절한 조건을 지정하여 원하는 문서만 남길 수 있습니다. 이 글에서는 $ne(Not Equal) 연산자를 활용해 특정 문서를 제외한 나머지 문서를 한 번에 삭제하는 방법을 예제와 함께 살펴보겠습니다.

1. 테스트용 컬렉션 생성 및 데이터 삽입

먼저 실습을 위해 컬렉션을 만들고 문서 세 개를 삽입하겠습니다. 아래 쿼리는 removeAllDocumentsExceptOneDemo라는 이름의 컬렉션에 학생 정보를 담은 문서들을 추가합니다.

>db.removeAllDocumentsExceptOneDemo.insertOne({"StudentName":"Larry","StudentAge":21});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c9c9de42d66697741252478")
}
>db.removeAllDocumentsExceptOneDemo.insertOne({"StudentName":"Mike","StudentAge":21,"StudentCountryName":"US"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c9c9dea2d66697741252479")
}
>db.removeAllDocumentsExceptOneDemo.insertOne({"StudentName":"Chris","StudentAge":24,"StudentCountryName":"AUS"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c9c9def2d6669774125247a")
}

2. 현재 저장된 전체 문서 확인

데이터가 정상적으로 삽입되었는지 find() 메서드로 확인해 보겠습니다.

> db.removeAllDocumentsExceptOneDemo.find().pretty();

위 쿼리를 실행하면 다음과 같이 세 개의 문서가 출력됩니다.

{
    "_id" : ObjectId("5c9c9de42d66697741252478"),
    "StudentName" : "Larry",
    "StudentAge" : 21
}
{
    "_id" : ObjectId("5c9c9dea2d66697741252479"),
    "StudentName" : "Mike",
    "StudentAge" : 21,
    "StudentCountryName" : "US"
}
{
    "_id" : ObjectId("5c9c9def2d6669774125247a"),
    "StudentName" : "Chris",
    "StudentAge" : 24,
    "StudentCountryName" : "AUS"
}

3. $ne 연산자로 특정 문서를 제외하고 삭제

이제 핵심 단계입니다. StudentAge가 24인 문서(Chris)만 남기고 나머지 문서를 모두 삭제하려면, remove() 메서드에 { StudentAge: { $ne: 24 } } 조건을 전달하면 됩니다. $ne는 '같지 않음(Not Equal)'을 의미하는 비교 연산자로, 조건 값과 일치하지 않는 모든 문서가 삭제 대상이 됩니다.

> db.removeAllDocumentsExceptOneDemo.remove({ StudentAge: { $ne: 24 } } );
WriteResult({ "nRemoved" : 2 })

실행 결과 nRemoved : 2가 반환된 것을 확인할 수 있는데, 이는 두 개의 문서가 성공적으로 삭제되었음을 의미합니다.

4. 삭제 후 결과 검증

마지막으로 find() 메서드를 다시 실행하여 남아 있는 문서를 확인해 보겠습니다.

> db.removeAllDocumentsExceptOneDemo.find().pretty();

출력 결과를 보면 StudentAge가 24인 문서 하나만 남아 있는 것을 알 수 있습니다.

{
    "_id" : ObjectId("5c9c9def2d6669774125247a"),
    "StudentName" : "Chris",
    "StudentAge" : 24,
    "StudentCountryName" : "AUS"
}

참고 사항

MongoDB 4.2 버전부터는 remove() 대신 deleteMany() 메서드 사용이 권장됩니다. 위 예제와 동일한 결과를 얻으려면 db.removeAllDocumentsExceptOneDemo.deleteMany({ StudentAge: { $ne: 24 } })처럼 작성하면 됩니다. 또한 삭제 작업은 되돌릴 수 없으므로, 운영 환경에서는 실행 전 반드시 조건문을 find()로 먼저 확인하여 삭제 대상 문서가 맞는지 검증하는 습관을 들이는 것이 좋습니다.