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

MongoDB에서 특정 필드 값을 기준으로 배열 내 문서 개수 집계하는 방법

배열 내부에서 특정 필드의 값에 해당하는 문서의 개수를 세려면 MongoDB의 $match 연산자를 활용하면 됩니다. 먼저 데모용 컬렉션을 생성하고 문서를 삽입해 보겠습니다.

> db.demo726.insertOne(
...    {
...       id:101,
...       "details": [
...          {
...             Name:"Chris"
...
...          },
...          {
...             Name:"Chris"
...
...          },
...          {
...             Name:"Bob"
...          }
...       ]
...    }
... );
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5eab318643417811278f5894")
}

find() 메서드를 사용하여 컬렉션의 모든 문서를 조회합니다.

> db.demo726.find();

위 명령은 다음과 같은 결과를 출력합니다.

{ "_id" : ObjectId("5eab318643417811278f5894"), "id" : 101, "details" : [ { "Name" : "Chris" }, { "Name" : "Chris" }, { "Name" : "Bob" } ] }

다음은 MongoDB에서 배열 안의 문서들을 특정 필드 값을 기준으로 집계(카운트)하는 쿼리입니다. $unwind로 배열을 개별 문서로 풀어낸 뒤, $match로 조건에 맞는 요소만 필터링하고, 마지막으로 $group$sum을 사용해 개수를 합산합니다.

> db.demo726.aggregate([
...
...    { $unwind: '$details' },
...
...    { $match: { 'details.Name': "Chris"} },
...       { $group: {
...          _id: "$Name",
...          Total_Value: { $sum: 1 }
...       }
...    }
... ]);

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

{ "_id" : null, "Total_Value" : 2 }

결과를 보면 details 배열 중 Name 필드가 "Chris"인 요소가 총 2개임을 확인할 수 있습니다. 이처럼 $unwind$match$group 순서로 구성된 애그리게이션 파이프라인을 사용하면 배열 필드 내부의 데이터도 손쉽게 필터링하고 집계할 수 있습니다.