배열 내부에서 특정 필드의 값에 해당하는 문서의 개수를 세려면 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 순서로 구성된 애그리게이션 파이프라인을 사용하면 배열 필드 내부의 데이터도 손쉽게 필터링하고 집계할 수 있습니다.