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

MongoDB에서 $group으로 고유한 객체 쌍과 모든 하위 문서 조회하기

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 단계: 그룹화 기준이었던 _idName 필드로 변경하고, 불필요한 _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) 등 다양한 집계 연산에도 응용할 수 있으니 참고하시기 바랍니다.