사용자 기본 설정 데이터를 사용한 집계
데이터 모델
회원 이름, 가입 날짜 및 스포츠 선호도를 추적하는 members
컬렉션 이 있는 스포츠 클럽 데이터베이스 를 가정해 보겠습니다.
db.members.insertMany( [ { _id: "jane", joined: ISODate("2011-03-02"), likes: ["golf", "racquetball"] }, { _id: "joe", joined: ISODate("2012-07-02"), likes: ["tennis", "golf", "swimming"] }, { _id: "ruth", joined: ISODate("2012-01-14"), likes: ["golf", "racquetball"] }, { _id: "harold", joined: ISODate("2012-01-21"), likes: ["handball", "golf", "racquetball"] }, { _id: "kate", joined: ISODate("2012-01-14"), likes: ["swimming", "tennis"] } ] )
단일 필드 반환
다음 작업은 $project
을 사용하여 members
컬렉션 의 모든 문서에 대해 _id
필드 만 반환합니다.
db.members.aggregate( [ { $project: { _id: 1 } } ] )
이 작업은 다음 문서를 반환합니다.
[ { _id: 'jane' }, { _id: 'joe' }, { _id: 'ruth' }, { _id: 'harold' }, { _id: 'kate' } ]
기본 쿼리 및 프로젝션 작업의 경우 find()
메서드를 사용하는 표준 쿼리가 최상의 성능을 발휘합니다.
문서 정규화 및 정렬
다음 작업은 멤버 이름을 대문자와 알파벳 순서로 반환합니다. 처리 할 멤버 이름을 정규화하기 위해 이 작업을 수행할 수 있습니다.
db.members.aggregate( [ { $project: { name: { $toUpper: "$_id" }, _id: 0 } }, { $sort: { name: 1 } } ] )
members
컬렉션의 모든 문서는 다음 작업으로 구성된 파이프라인을 통과합니다.
이 연산은 다음과 같은 결과를 반환합니다.
[ { name: 'HAROLD' }, { name: 'JANE' }, { name: 'JOE' }, { name: 'KATE' }, { name: 'RUTH' } ]
가입 월별로 정렬된 사용자 이름 반환
다음 집계 작업은 가입한 달을 기준으로 정렬된 멤버 이름을 반환합니다. 이 집계 을 사용하여 멤버십 갱신 알림을 생성할 수 있습니다.
db.members.aggregate( [ { $project: { month_joined: { $month: "$joined" }, name: "$_id", _id: 0 } }, { $sort: { month_joined: 1 } } ] )
파이프라인은 다음 작업을 통해 members
컬렉션의 모든 문서를 전달합니다.
$project
연산자:두 개의 새 필드를 만듭니다:
month_joined
및name
.결과에서
id
를 표시하지 않습니다.aggregate()
메서드에는 명시적으로 억제하지 않는 한_id
를 포함합니다.
$month
연산자는joined
필드의 값을 월별 정수 표현으로 변환합니다. 그런 다음$project
연산자가 해당 값을month_joined
필드에 할당합니다.$sort
연산자는month_joined
필드를 기준으로 결과를 정렬합니다.
이 연산은 다음과 같은 결과를 반환합니다.
[ { month_joined: 1, name: 'ruth' }, { month_joined: 1, name: 'harold' }, { month_joined: 1, name: 'kate' }, { month_joined: 3, name: 'jane' }, { month_joined: 7, name: 'joe' } ]
월별 총 가입 인원 반환
다음 연산은 한 해 동안 월별로 얼마나 많은 사람이 가입했는지를 보여줍니다. 채용 및 마케팅 전략을 위해 이 애그리게이션 데이터를 사용할 수 있습니다.
db.members.aggregate( [ { $project: { month_joined: { $month: "$joined" } } } , { $group: { _id: { month_joined: "$month_joined" } , number: { $sum: 1 } } }, { $sort: { "_id.month_joined": 1 } } ] )
파이프라인은 다음 작업을 통해 members
컬렉션의 모든 문서를 전달합니다.
$project
연산자는month_joined
라는 새 필드를 만듭니다.$month
연산자는joined
필드의 값을 월별 정수 표현으로 변환합니다. 그런 다음$project
연산자가month_joined
필드에 값을 할당합니다.$group
연산자는 주어진month_joined
값을 가진 모든 문서를 수집하고 해당 값에 대한 문서 개수를 계산합니다. 구체적으로$group
은 각 고유 값에 대해 두 개의 필드가 있는 새로운 '월별' 문서를 생성합니다:_id
: 여기에는month_joined
필드와 해당 값이 포함된 중첩 문서가 포함되어 있습니다.number
: 생성된 필드입니다.$sum
연산자는 지정된month_joined
값을 포함하는 모든 문서에 대해 이 필드를 1씩 증가시킵니다.
집계 작업은 다음 문서를 반환합니다.
[ { _id: { month_joined: 1 }, number: 3 }, { _id: { month_joined: 3 }, number: 1 }, { _id: { month_joined: 7 }, number: 1 } ]
'좋아요'를 가장 많이 받은 상위 5개 항목 반환
다음 집계 은 데이터 세트 에서 가장 '좋아요'를 받은 상위 5개 활동을 수집합니다. 이러한 유형의 분석은 계획 및 향후 개발 정보를 제공하는 데 도움이 될 수 있습니다.
db.members.aggregate( [ { $unwind: "$likes" }, { $group: { _id: "$likes" , number: { $sum: 1 } } }, { $sort: { number: -1 } }, { $limit: 5 } ] )
파이프라인은 members
컬렉션의 모든 문서로 시작하고 다음 작업을 통해 이러한 문서를 전달합니다.
$unwind
연산자는likes
배열의 각 값을 구분하고 배열의 모든 요소에 대해 소스 문서의 새 버전을 만듭니다.예시
members
컬렉션에 다음 문서가 주어집니다{ _id: "jane", joined: ISODate("2011-03-02"), likes: ["golf", "racquetball"] } $unwind
연산자 는 다음 문서를 출력합니다.{ _id: "jane", joined: ISODate("2011-03-02"), likes: "golf" } { _id: "jane", joined: ISODate("2011-03-02"), likes: "racquetball" } $group
연산자는likes
필드에 대해 동일한 값을 가진 모든 문서를 수집하고 각 그룹을 계산합니다. 이 정보를 사용하여$group
은 두 개의 필드가 있는 새 문서를 생성합니다._id
:likes
값을 포함합니다.number
: 생성된 필드입니다.$sum
연산자는 지정된likes
값을 포함하는 모든 문서에 대해 이 필드를 1씩 증가시킵니다.
$sort
연산자는number
필드를 기준으로 이러한 문서를 역순으로 정렬합니다.$limit
연산자는 결과에서 처음 5개의 문서만 포함합니다.
집계 작업은 다음 문서를 반환합니다.
[ { _id: 'golf', number: 4 }, { _id: 'racquetball', number: 3 }, { _id: 'tennis', number: 2 }, { _id: 'swimming', number: 2 }, { _id: 'handball', number: 1 } ]