정의
지정된 정렬 순서에 따라 그룹 내 상위 n개 요소의 집계를 반환합니다. 그룹에 n개 미만의 요소가 포함된 경우 $topN은 그룹의 모든 요소를 반환합니다.
참고
$topN의 기타 용도
이 페이지에서는 축적자 사용되는 $topN 에 대해 설명합니다. 축적자는 입력 문서 그룹 에서 애그리게이션된 값을 반환합니다.
지정된 정렬 순서에 따라 특정 창 문서에서 상위 n 요소를 반환하는 $topN (window function)를 사용할 수도 있습니다.
구문
{ $topN: { n: <expression>, sortBy: { <field1>: <sort order>, <field2>: <sort order> ... }, output: <expression> } }
필드 | 유형 | 설명 |
|---|---|---|
| 표현식 | 그룹 반환되는 최대 결과 수를 결정합니다. |
| 문서 |
|
| 표현식 | 그룹 의 각 요소에 대한 출력을 지정합니다. 모든 표현식 가능합니다. |
행동
Null 및 누락된 값
$topNnull 값을 필터링하지 않습니다.$topN누락된 값을 출력에 유지되는 null로 변환합니다.
db.aggregate( [ { $documents: [ { playerId: "PlayerA", gameId: "G1", score: 1 }, { playerId: "PlayerB", gameId: "G1", score: 2 }, { playerId: "PlayerC", gameId: "G1", score: 3 }, { playerId: "PlayerD", gameId: "G1"}, { playerId: "PlayerE", gameId: "G1", score: null } ] }, { $group: { _id: "$gameId", playerId: { $topN: { output: [ "$playerId", "$score" ], sortBy: { "score": 1 }, n: 3 } } } } ] )
이 예시에서는
$documents플레이어 점수가 포함된 리터럴 문서를 생성합니다.$group은gameId기준으로 문서를 그룹화합니다. 이 예시에는gameId가 단 하나(G1)만 있습니다.PlayerD점수가 누락되었고PlayerE에 nullscore가 있습니다. 이 값은 모두 null로 간주됩니다.playerId및score필드는output : ["$playerId"," $score"]로 지정되고 배열 값으로 반환됩니다.sortBy: { "score" : 1 }때문에 null 값은 반환된playerId배열 앞에 정렬됩니다.
[ { _id: 'G1', playerId: [ [ 'PlayerD', null ], [ 'PlayerE', null ], [ 'PlayerA', 1 ] ] } ]
BSON 데이터 유형 정렬 순서
서로 다른 유형을 정렬할 때 BSON 데이터 유형 의 순서를 사용하여 순서를 결정합니다. 예를 들어 값이 문자열과 숫자로 구성된 컬렉션을 생각해 보겠습니다.
오름차순 정렬에서는 문자열 값이 숫자 값 뒤에 정렬됩니다.
내림차순 정렬에서는 문자열 값이 숫자 값보다 먼저 정렬됩니다.
db.aggregate( [ { $documents: [ { playerId: "PlayerA", gameId: "G1", score: 1 }, { playerId: "PlayerB", gameId: "G1", score: "2" }, { playerId: "PlayerC", gameId: "G1", score: "" } ] }, { $group: { _id: "$gameId", playerId: { $topN: { output: ["$playerId","$score"], sortBy: {"score": -1}, n: 3 } } } } ] )
이 예시에서는
PlayerA의 점수는 정수입니다.PlayerB문자열"2"점수를 가집니다.PlayerC빈 문자열 점수가 있습니다.
정렬이 { "score" : -1 } 내림차순으로 이루어지기 때문에 문자열 리터럴 값은 PlayerA 의 숫자 점수보다 먼저 정렬됩니다.
[ { _id: "G1", playerId: [ [ "PlayerB", "2" ], [ "PlayerC", "" ], [ "PlayerA", 1 ] ] } ]
예시
이 페이지의 예제에서는 sample_mflix 데이터 세트의 데이터를 사용합니다. 이 데이터 세트를 자체 관리형 MongoDB deployment 에 로드하는 방법에 대한 자세한 내용은 샘플 데이터 세트 로드를 참조하세요. 샘플 데이터베이스를 수정한 경우 이 페이지의 예제를 실행 하려면 데이터베이스를 삭제하고 다시 만들어야 할 수 있습니다.
단일 장르에서 가장 높은 평점을 받은 영화 3편 찾기
$topN 축적자 사용하여 Short 장르에서 가장 높은 평점을 받은 영화 3편을 찾을 수 있습니다.
db.movies.aggregate( [ { $match: { genres: "Short", "imdb.rating": { $gt: 0 } } }, { $group: { _id: "Short", topRatedMovies: { $topN: { output: [ "$title", "$imdb.rating" ], sortBy: { "imdb.rating": -1, title: 1 }, n: 3 } } } } ] )
예시 파이프라인:
각 장르에 대한 최고 평점 영화 찾기
$topN 축적자 사용하여 각 장르에 대한 최고 평점 영화를 찾을 수 있습니다.
db.movies.aggregate( [ { $unwind: "$genres" }, { $match: { "imdb.rating": { $gt: 0 } } }, { $group: { _id: "$genres", topRatedMovies: { $topN: { output: [ "$title", "$imdb.rating" ], sortBy: { "imdb.rating": -1, title: 1 }, n: 3 } } } }, { $sort: { _id: 1 } }, { $limit: 5 } ] )
예시 파이프라인:
$unwind를 사용하여 각 동영상의genres배열 확장합니다.$match를 사용하여imdb.rating값을 포함하는 문서만 보관합니다.$group를 사용하여 장르별로 결과를 그룹 .$topN가output: [ "$title", "$imdb.rating" ]과 함께 반환하는 필드를 지정합니다.sortBy: { "imdb.rating": -1, title: 1 }를 사용하여 평점을 기준으로 영화의 순위를 지정하고title를 결정론적 타이 브레이커로 사용합니다.$topN를 사용하여n: 3이 있는 각 장르에 대한 상위 3개 영화를 반환합니다.
그룹 키를 기반으로 동적으로 n 설정
n의 값을 동적으로 할당할 수 있습니다. 다음 예시 $cond 표현식 사용하여 콘텐츠 등급에 따라 다양한 영화 수를 반환합니다.
db.movies.aggregate( [ { $match: { rated: { $in: [ "G", "PG", "PG-13", "R" ] }, "imdb.rating": { $gt: 0 } } }, { $group: { _id: { rated: "$rated" }, movies: { $topN: { output: { title: "$title", rating: "$imdb.rating" }, n: { $cond: { if: { $eq: [ "$rated", "PG" ] }, then: 3, else: 1 } }, sortBy: { "imdb.rating": -1 } } } } }, { $sort: { "_id.rated": 1 } } ] )
예시 파이프라인:
Uses
$matchto keep only movies withG,PG,PG-13, orRcontent ratings that include animdb.ratingvalue.$group를 사용하여_id: { rated: "$rated" }로 콘텐츠 등급별로 결과를 그룹 합니다.$topN가output: { title: "$title", rating: "$imdb.rating" }과 함께 반환하는 필드를 지정합니다.콘텐츠 등급이
PG인 경우n은 3입니다. 그렇지 않으면n는 1가 됩니다.sortBy: { "imdb.rating": -1 }를 사용하여 IMDb 점수를 기준으로 상위n영화를 찾습니다.콘텐츠 등급별로 결과를 알파벳순으로 정렬합니다.