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

MongoDB에서 다른 필드를 기준으로 값 그룹 찾는 방법

MongoDB에서 다른 필드를 기준으로 값을 그룹화하려면 $group 연산자와 $project 연산자를 함께 사용해야 합니다. 이번 글에서는 실제 예제를 통해 단계별로 자세히 살펴보겠습니다.

1. 샘플 컬렉션 생성하기

먼저 insertOne() 메서드를 사용해 문서가 담긴 컬렉션을 생성합니다.

> db.demo374.insertOne(
...    {
...       "Name" : "Chris",
...       "HobbyDetails" : [
...          "Reading Book",
...          "Playing Football"
...       ],
...       "CountryName" : "US"
...    }
... );
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e5a04402ae06a1609a00b04")
}
> db.demo374.insertOne(
...    {
...       "Name" : "Chris",
...       "HobbyDetails" : [
...          "Browsing Internet",
...          "Playing Football"
...       ],
...       "CountryName" : "US"
...    }
... );
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e5a04402ae06a1609a00b05")
}

2. 저장된 문서 조회하기

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

> db.demo374.find();

위 명령을 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.

{ "_id" : ObjectId("5e5a04402ae06a1609a00b04"), "Name" : "Chris", "HobbyDetails" : [ "Reading Book", "Playing Football" ], "CountryName" : "US" }
{ "_id" : ObjectId("5e5a04402ae06a1609a00b05"), "Name" : "Chris", "HobbyDetails" : [ "Browsing Internet", "Playing Football" ], "CountryName" : "US" }

3. 다른 필드를 기준으로 값 그룹화하기

다음은 MongoDB에서 다른 필드를 기준으로 값을 그룹화하는 집계(aggregation) 쿼리입니다. 먼저 $match로 국가(CountryName)가 US인 문서만 필터링하고, $group으로 이름(Name)별로 묶은 뒤 $addToSet으로 취미 목록을 수집합니다. 마지막으로 $reduce와 $concatArrays를 사용해 중첩된 배열을 하나의 배열로 병합합니다.

> db.demo374.aggregate([
...    {$match : { "CountryName" : "US"}},
...    {$group : {"_id" : "$Name", "HobbyDetails" : {$addToSet : "$HobbyDetails"}}},
...    {$project : {"_id" : 0, "Name" : "$_id", "HobbyDetails" : {$reduce : {input : "$HobbyDetails", initialValue : [], in: { $concatArrays : ["$$value", "$$this"] }}}}}
... ]).pretty()

쿼리를 실행하면 다음과 같은 출력 결과가 나타납니다.

{
   "Name" : "Chris",
   "HobbyDetails" : [
      "Browsing Internet",
      "Playing Football",
      "Reading Book",
      "Playing Football"
   ]
}

이처럼 $group과 $project를 조합하면 특정 필드(여기서는 Name)를 기준으로 문서를 그룹화하고, 각 그룹에 속한 배열 형태의 값(HobbyDetails)을 하나의 배열로 통합할 수 있습니다. 참고로 $addToSet은 동일한 문서 내 중복은 제거하지만, 서로 다른 문서에 같은 값이 존재하면 최종 병합 과정에서 중복이 남을 수 있습니다. 완전한 중복 제거가 필요하다면 $setUnion 연산자를 활용하는 것도 좋은 방법입니다.