MongoDB에서 중복된 데이터를 그룹화하여 고유한(distinct) 객체 쌍을 추출하려면 애그리게이션 파이프라인의 $group 연산자를 활용하는 것이 가장 효과적입니다. 이 글에서는 실제 예제를 통해 컬렉션 생성부터 고유한 객체 쌍 조회까지 전체 과정을 단계별로 살펴보겠습니다.
1. 샘플 컬렉션 생성하기
먼저 insertOne() 메서드를 사용하여 데모용 컬렉션에 문서를 삽입합니다. 여기서는 이름(Name)과 점수(Score) 필드를 가진 문서 4개를 생성합니다.
> db.demo522.insertOne({"Name":"John","Score":45});{
"acknowledged" : true,
"insertedId" : ObjectId("5e89b646b3fbf26334ef611b")
}
> db.demo522.insertOne({"Name":"Bob","Score":67});{
"acknowledged" : true,
"insertedId" : ObjectId("5e89b64eb3fbf26334ef611c")
}
> db.demo522.insertOne({"Name":"John","Score":55});{
"acknowledged" : true,
"insertedId" : ObjectId("5e89b655b3fbf26334ef611d")
}
> db.demo522.insertOne({"Name":"Bob","Score":33});{
"acknowledged" : true,
"insertedId" : ObjectId("5e89b65cb3fbf26334ef611e")
}2. 저장된 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.
> db.demo522.find();
위 명령을 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5e89b646b3fbf26334ef611b"), "Name" : "John", "Score" : 45 }
{ "_id" : ObjectId("5e89b64eb3fbf26334ef611c"), "Name" : "Bob", "Score" : 67 }
{ "_id" : ObjectId("5e89b655b3fbf26334ef611d"), "Name" : "John", "Score" : 55 }
{ "_id" : ObjectId("5e89b65cb3fbf26334ef611e"), "Name" : "Bob", "Score" : 33 }출력 결과를 보면 John과 Bob이 각각 두 번씩 등장하는 것을 확인할 수 있습니다. 즉, 동일한 이름을 가진 문서가 여러 개 존재합니다.
3. $group으로 고유한 객체 쌍 조회하기
이제 애그리게이션 파이프라인을 구성하여 이름 기준으로 문서를 그룹화하고, 각 그룹의 점수 합계를 계산해 보겠습니다. $group은 _id 필드에 그룹화 기준이 되는 값을 지정하고, $sum 같은 누적 연산자로 집계 값을 산출합니다. 이후 $project 단계에서 출력 형태를 원하는 대로 재구성할 수 있습니다.
> var query = [
... {
... "$group": {
... "_id": "$Name",
... "Score": { "$sum": "$Score" }
... }
... },
... {
... "$project": {
... "Name": "$_id", "_id": 0, "Score": 1
... }
... }
... ];
>
> db.demo522.aggregate(query);쿼리 동작 방식 설명
- $group 단계:
Name필드 값을 기준으로 문서들을 묶고, 각 그룹 내Score값의 합계를 계산합니다. - $project 단계: 그룹화 기준이었던
_id를Name필드로 변경하고, 불필요한_id는 제외(_id: 0)하여 깔끔한 출력 결과를 만듭니다.
4. 최종 실행 결과
위 애그리게이션 쿼리를 실행하면 다음과 같이 이름별로 중복 없이 정리된 고유한 객체 쌍을 얻을 수 있습니다.
{ "Score" : 100, "Name" : "Bob" }
{ "Score" : 100, "Name" : "John" }결과를 보면 John의 점수(45 + 55)와 Bob의 점수(67 + 33)가 각각 합산되어 100으로 집계되었으며, 동일한 이름의 문서들이 하나의 고유한 객체로 병합된 것을 확인할 수 있습니다.
마무리
MongoDB에서 특정 필드 기준으로 중복을 제거하고 집계된 결과를 얻고 싶다면 $group과 $project를 조합한 애그리게이션이 가장 강력한 방법입니다. 이 패턴은 점수 합계뿐만 아니라 평균($avg), 최대값($max), 최소값($min) 등 다양한 집계 연산에도 응용할 수 있으니 참고하시기 바랍니다.