문서 홈 → 애플리케이션 개발 → MongoDB 매뉴얼
사용자 기본 설정 데이터를 사용한 애그리게이션
이 페이지의 내용
데이터 모델
사용자의 가입 날짜 및 스포츠 선호도를 추적하고 다음과 유사한 문서에 이러한 데이터를 저장하는 users
컬렉션이 포함된 데이터베이스를 가진 가상의 스포츠 클럽을 예로 들어 보겠습니다.
{ _id : "jane", joined : ISODate("2011-03-02"), likes : ["golf", "racquetball"] } { _id : "joe", joined : ISODate("2012-07-02"), likes : ["tennis", "golf", "swimming"] }
문서 정규화 및 정렬
다음 작업은 사용자 이름을 대문자와 알파벳순으로 반환합니다. 이 애그리게이션에는 users
컬렉션의 모든 문서에 대한 사용자 이름이 포함되어 있습니다. 처리할 사용자 이름을 정규화하기 위해 이 작업을 수행할 수 있습니다.
db.users.aggregate( [ { $project : { name:{$toUpper:"$_id"} , _id:0 } }, { $sort : { name : 1 } } ] )
users
컬렉션의 모든 문서는 다음 작업으로 구성된 파이프라인을 통과합니다.
애그리게이션 결과는 다음과 유사합니다:
{ "name" : "JANE" }, { "name" : "JILL" }, { "name" : "JOE" }
가입 월별로 정렬된 사용자 이름 반환
이 페이지의 내용
다음 애그리게이션 작업은 가입한 달을 기준으로 정렬된 사용자 이름을 반환합니다. 이러한 종류의 애그리게이션은 멤버십 갱신 알림을 생성하는 데 도움이 될 수 있습니다.
db.users.aggregate( [ { $project : { month_joined : { $month : "$joined" }, name : "$_id", _id : 0 } }, { $sort : { month_joined : 1 } } ] )
파이프라인은 다음 작업을 통해 users
컬렉션의 모든 문서를 전달합니다.
$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" : 2, "name" : "jill" }
월별 총 가입 인원 반환
이 페이지의 내용
다음 연산은 한 해 동안 월별로 얼마나 많은 사람이 가입했는지를 보여줍니다. 채용 및 마케팅 전략을 위해 이 애그리게이션 데이터를 사용할 수 있습니다.
db.users.aggregate( [ { $project : { month_joined : { $month : "$joined" } } } , { $group : { _id : {month_joined:"$month_joined"} , number : { $sum : 1 } } }, { $sort : { "_id.month_joined" : 1 } } ] )
파이프라인은 다음 작업을 통해 users
컬렉션의 모든 문서를 전달합니다.
$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" : 2 }, "number" : 9 }, { "_id" : { "month_joined" : 3 }, "number" : 5 }
'좋아요'를 가장 많이 받은 상위 5개 항목 반환
이 페이지의 내용
다음 애그리게이션은 데이터 세트에서 '좋아요(Liked)'를 가장 많이 받은 상위 5개 활동을 수집합니다. 이러한 유형의 분석은 계획 및 향후 개발 정보를 제공하는 데 도움이 될 수 있습니다.
db.users.aggregate( [ { $unwind : "$likes" }, { $group : { _id : "$likes" , number : { $sum : 1 } } }, { $sort : { number : -1 } }, { $limit : 5 } ] )
파이프라인은 users
컬렉션의 모든 문서로 시작하고 다음 작업을 통해 이러한 문서를 전달합니다.
$unwind
연산자는likes
배열의 각 값을 구분하고 배열의 모든 요소에 대해 소스 문서의 새 버전을 만듭니다.예제
users
컬렉션에 다음 문서가 주어집니다{ _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" : 33 }, { "_id" : "racquetball", "number" : 31 }, { "_id" : "swimming", "number" : 24 }, { "_id" : "handball", "number" : 19 }, { "_id" : "tennis", "number" : 18 }