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

MongoDB에서 중복 레코드를 찾는 방법 – 집계 프레임워크 활용 가이드

MongoDB에서 중복된 데이터를 효율적으로 찾고 싶다면 집계 프레임워크(Aggregation Framework)를 활용하는 것이 가장 좋은 방법입니다. 이 글에서는 실제 예제를 통해 컬렉션을 생성하고, 중복된 레코드를 조회하는 전체 과정을 단계별로 살펴보겠습니다.

1. 샘플 컬렉션 생성하기

먼저 중복 데이터가 포함된 문서들을 담은 컬렉션을 만들어 보겠습니다. insertOne() 메서드를 사용해 여러 개의 문서를 순차적으로 삽입합니다.

> db.findDuplicateRecordsDemo.insertOne({"StudentFirstName":"John"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c8a330293b406bd3df60e01")
}
> db.findDuplicateRecordsDemo.insertOne({"StudentFirstName":"John"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c8a330493b406bd3df60e02")
}
> db.findDuplicateRecordsDemo.insertOne({"StudentFirstName":"Carol"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c8a330c93b406bd3df60e03")
}
> db.findDuplicateRecordsDemo.insertOne({"StudentFirstName":"Sam"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c8a331093b406bd3df60e04")
}
> db.findDuplicateRecordsDemo.insertOne({"StudentFirstName":"Carol"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c8a331593b406bd3df60e05")
}
> db.findDuplicateRecordsDemo.insertOne({"StudentFirstName":"Mike"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c8a331e93b406bd3df60e06")
}

위 예제에서 JohnCarol은 각각 두 번씩 삽입되어 의도적으로 중복 데이터가 생성되었습니다.

2. 저장된 전체 문서 확인하기

find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.

> db.findDuplicateRecordsDemo.find();

실행 결과는 다음과 같습니다.

{ "_id" : ObjectId("5c8a330293b406bd3df60e01"), "StudentFirstName" : "John" }
{ "_id" : ObjectId("5c8a330493b406bd3df60e02"), "StudentFirstName" : "John" }
{ "_id" : ObjectId("5c8a330c93b406bd3df60e03"), "StudentFirstName" : "Carol" }
{ "_id" : ObjectId("5c8a331093b406bd3df60e04"), "StudentFirstName" : "Sam" }
{ "_id" : ObjectId("5c8a331593b406bd3df60e05"), "StudentFirstName" : "Carol" }
{ "_id" : ObjectId("5c8a331e93b406bd3df60e06"), "StudentFirstName" : "Mike" }

3. 집계 파이프라인으로 중복 레코드 찾기

이제 핵심인 중복 조회 쿼리입니다. aggregate() 메서드에 세 가지 단계를 조합하여 사용합니다.

  • $group: StudentFirstName 필드 값을 기준으로 그룹화하고, 각 그룹의 문서 수를 $sum: 1로 계산합니다.
  • $match: 값이 null이 아니면서($ne: null) 문서 수가 1보다 큰($gt: 1) 그룹, 즉 중복된 항목만 필터링합니다.
  • $project: 출력 결과에서 _id를 제외하고 StudentFirstName 필드만 깔끔하게 표시합니다.
> db.findDuplicateRecordsDemo.aggregate(
    ... {"$group" : { "_id": "$StudentFirstName", "count": { "$sum": 1 } } },
    ... {"$match": {"_id" :{ "$ne" : null } , "count" : {"$gt": 1} } },
    ... {"$project": {"StudentFirstName" : "$_id", "_id" : 0} }
... );

4. 실행 결과

위 쿼리를 실행하면 중복된 레코드만 정확히 추출됩니다.

{ "StudentFirstName" : "Carol" }
{ "StudentFirstName" : "John" }

결과에서 확인할 수 있듯이, CarolJohn만 두 번씩 등장했기 때문에 중복 레코드로 반환되었고, 한 번만 삽입된 Sam과 Mike는 결과에서 제외되었습니다.

마무리

MongoDB의 집계 프레임워크를 사용하면 별도의 스크립트나 외부 도구 없이도 $group, $match, $project 세 단계만으로 중복 데이터를 손쉽게 식별할 수 있습니다. 대량의 데이터에서 데이터 정합성을 점검하거나 중복을 정리하기 전에 어떤 값이 중복되어 있는지 먼저 파악할 때 이 방법을 유용하게 활용해 보세요.