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

MongoDB에서 두 개의 키를 기준으로 중복 항목 제거하는 방법

MongoDB에서 두 개의 키(필드) 조합이 동일한 중복 문서를 제거하려면 aggregate() 메서드를 활용하면 됩니다. 이 글에서는 예제 컬렉션을 만들고, 두 개의 키를 기준으로 중복을 걸러내는 집계 쿼리를 단계별로 살펴보겠습니다.

예제 컬렉션 생성

먼저 demo108이라는 이름의 컬렉션에 문서를 삽입합니다. Value1 값이 같더라도 Value2 값이 다르면 별개의 문서로 취급됩니다.

> db.demo108.insertOne({"Value1":23,"Value2":24});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e2ee3e49fd5fd66da214477")
}
> db.demo108.insertOne({"Value1":23,"Value2":25});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e2ee3f29fd5fd66da214478")
}
> db.demo108.insertOne({"Value1":23,"Value2":24});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e2ee3f59fd5fd66da214479")
}

위 코드에서 첫 번째와 세 번째 문서는 Value1과 Value2 값이 모두 동일하기 때문에 서로 중복된 상태입니다.

삽입된 문서 확인하기

find() 메서드를 사용하여 컬렉션의 모든 문서를 조회합니다.

> db.demo108.find();

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

{ "_id" : ObjectId("5e2ee3e49fd5fd66da214477"), "Value1" : 23, "Value2" : 24 }
{ "_id" : ObjectId("5e2ee3f29fd5fd66da214478"), "Value1" : 23, "Value2" : 25 }
{ "_id" : ObjectId("5e2ee3f59fd5fd66da214479"), "Value1" : 23, "Value2" : 24 }

두 개의 키로 중복 제거하는 쿼리

다음은 Value1과 Value2 두 필드를 기준으로 중복 항목을 제거하는 집계 파이프라인입니다.

> db.demo108.aggregate([{ "$sort": { "_id": 1 } },
... {
...    "$group": {
...       "_id": { "Value1": "$Value1", "Value2": "$Value2" },
...       "doc": { "$first": "$$ROOT" }
...    }
... },
... { "$replaceRoot": { "newRoot": "$doc" } },
... { "$out": "demo108" }]);

쿼리 동작 원리

  • $sort: _id 값을 기준으로 오름차순 정렬하여 어떤 문서를 남길지 순서를 결정합니다.
  • $group: Value1과 Value2의 조합을 그룹화 기준(_id)으로 사용하고, 각 그룹에서 가장 처음 등장한 전체 문서($$ROOT)를 $first로 선택합니다.
  • $replaceRoot: 그룹화 결과 구조 대신 저장해 둔 원본 문서(doc)를 최상위 레벨로 되돌립니다.
  • $out: 집계 결과를 demo108 컬렉션에 다시 덮어써서 실제 중복 제거가 적용되도록 합니다.

중복 제거 후 결과 확인

집계 쿼리 실행 후 다시 find() 메서드로 컬렉션을 조회합니다.

> db.demo108.find();

출력 결과를 보면 Value1과 Value2 조합이 동일했던 중복 문서 하나가 사라진 것을 확인할 수 있습니다.

{ "_id" : ObjectId("5e2ee3f29fd5fd66da214478"), "Value1" : 23, "Value2" : 25 }
{ "_id" : ObjectId("5e2ee3e49fd5fd66da214477"), "Value1" : 23, "Value2" : 24 }