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

MongoDB에서 특정 값의 개수 구하는 방법 – aggregate() 파이프라인 완벽 가이드

MongoDB에서 배열 필드 안에 포함된 특정 값이 몇 번 등장하는지 확인하고 싶다면 aggregate() 메서드를 사용하는 것이 가장 효과적입니다. 이 글에서는 실제 예제를 통해 컬렉션을 생성하고, 집계 파이프라인을 구성하여 특정 값의 개수를 세는 방법을 단계별로 살펴보겠습니다.

1. 샘플 컬렉션 생성하기

먼저 클라이언트 이름 정보를 담고 있는 문서를 하나 삽입해 보겠습니다. 아래 예제에서는 details라는 배열 필드에 여러 개의 고객명이 중복되어 들어가 있습니다.

> db.demo210.insertOne(
...   {
...     details: [
...       {
...         ClientName: "Robert"
...       },
...       {
...         ClientName: "John Doe"
...       },
...       {
...         ClientName: "Robert"
...       },
...       {
...         ClientName: "Robert"
...       },
...       {
...         ClientName: "David Miller"
...       }
...     ]
...   }
...);
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e3d99ab03d395bdc21346f9")
}

2. find()로 전체 문서 조회하기

삽입된 데이터를 확인하려면 find() 메서드를 사용합니다.

> db.demo210.find();

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

{ "_id" : ObjectId("5e3d99ab03d395bdc21346f9"), "details" : [ { "ClientName" : "Robert" }, { "ClientName" : "John Doe" }, { "ClientName" : "Robert" }, { "ClientName" : "Robert" }, { "ClientName" : "David Miller" } ] }

3. aggregate()로 특정 값 개수 세기

이제 핵심 단계입니다. "Robert"라는 값이 몇 번 등장하는지 계산하기 위해 다음과 같은 집계 파이프라인을 작성할 수 있습니다.

> db.demo210.aggregate([
...   { "$match" : { "details.ClientName" : "Robert" } },
...   { "$unwind" : "$details" },
...   { "$match" : { "details.ClientName" : "Robert" } },
...   { "$group" : { "_id" : "$_id", "Size" : { "$sum" : 1 } } },
...   { "$match" : { "Size" : { "$gte" : 2 } } }
...]);

파이프라인 단계별 설명

  • $match: details.ClientName이 "Robert"인 문서만 먼저 걸러냅니다.
  • $unwind: details 배열을 각 요소별로 분해하여 개별 문서로 만듭니다.
  • $match (두 번째): 배열 분해 후 다시 한번 "Robert"인 요소만 남겨 정확한 카운트를 보장합니다.
  • $group: 문서의 _id를 기준으로 그룹화하고, $sum: 1로 등장 횟수를 합산합니다.
  • $match ($gte): 개수가 2 이상인 결과만 최종 출력합니다. 필요에 따라 이 조건은 자유롭게 조정할 수 있습니다.

실행 결과

위 쿼리를 실행하면 다음과 같은 결과를 얻을 수 있습니다.

{ "_id" : ObjectId("5e3d99ab03d395bdc21346f9"), "Size" : 3 }

결과를 해석해 보면, 해당 문서의 details 배열 안에서 "Robert"가 총 3번 등장했다는 의미입니다. 이처럼 $match, $unwind, $group 단계를 조합하면 배열 내부의 값 개수를 손쉽게 집계할 수 있습니다.