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

MongoDB에서 중복 문서를 그룹화하는 쿼리 작성법

MongoDB에서 중복된 문서들을 특정 필드 값을 기준으로 그룹화하려면 aggregate() 메서드와 $group 연산자를 사용하면 됩니다. 이 글에서는 실제 예제를 통해 중복 문서를 그룹화하는 과정을 단계별로 살펴보겠습니다.

1. 컬렉션 생성 및 문서 삽입

먼저 demo501이라는 컬렉션을 만들고 여러 개의 문서를 삽입합니다. 의도적으로 동일한 이름(Chris, John)을 가진 문서를 포함시켜 중복 데이터 상황을 재현했습니다.

> db.demo501.insertOne({"Name":"Chris"});{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e8752f0987b6e0e9d18f566")
}
> db.demo501.insertOne({"Name":"Bob"});{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e8752f4987b6e0e9d18f567")
}
> db.demo501.insertOne({"Name":"Chris"});{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e8752f8987b6e0e9d18f568")
}
> db.demo501.insertOne({"Name":"John"});{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e8752fb987b6e0e9d18f569")
}
> db.demo501.insertOne({"Name":"Chris"});{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e8752fd987b6e0e9d18f56a")
}
> db.demo501.insertOne({"Name":"John"});{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e875301987b6e0e9d18f56b")
}
> db.demo501.insertOne({"Name":"David"});{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e875307987b6e0e9d18f56c")
}

2. 저장된 문서 전체 조회

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

> db.demo501.find();

위 명령을 실행하면 다음과 같은 결과가 출력됩니다.

{ "_id" : ObjectId("5e8752f0987b6e0e9d18f566"), "Name" : "Chris" }
{ "_id" : ObjectId("5e8752f4987b6e0e9d18f567"), "Name" : "Bob" }
{ "_id" : ObjectId("5e8752f8987b6e0e9d18f568"), "Name" : "Chris" }
{ "_id" : ObjectId("5e8752fb987b6e0e9d18f569"), "Name" : "John" }
{ "_id" : ObjectId("5e8752fd987b6e0e9d18f56a"), "Name" : "Chris" }
{ "_id" : ObjectId("5e875301987b6e0e9d18f56b"), "Name" : "John" }
{ "_id" : ObjectId("5e875307987b6e0e9d18f56c"), "Name" : "David" }

출력 결과를 보면 Chris는 3개, John은 2개로 동일한 Name 값을 가진 문서가 여러 개 존재하는 것을 확인할 수 있습니다.

3. $group으로 중복 문서 그룹화하기

다음은 MongoDB 애그리게이션 파이프라인에서 $group 연산자를 사용해 Name 필드를 기준으로 중복 문서를 그룹화하는 쿼리입니다.

> db.demo501.aggregate( [ { $group : { _id : "$Name" } } ] )

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

{ "_id" : "David" }
{ "_id" : "John" }
{ "_id" : "Bob" }
{ "_id" : "Chris" }

쿼리 동작 원리

$group 단계에서 _id : "$Name"으로 지정하면 Name 필드의 값이 같은 문서들이 하나의 그룹으로 묶입니다. 결과적으로 중복되지 않는 고유한 이름 값만 출력됩니다.

여기에 $sum, $count 같은 누적 연산자를 추가하면 각 그룹에 속한 문서의 개수까지 함께 집계할 수 있습니다. 예를 들어 다음 쿼리는 이름별 중복 횟수를 반환합니다.

> db.demo501.aggregate([
... { $group : { _id : "$Name", count : { $sum : 1 } } }
... ])

이처럼 aggregate()와 $group을 조합하면 중복 데이터를 손쉽게 식별하고 그룹별 통계를 산출할 수 있어, 데이터 정제나 분석 작업에 매우 유용합니다.