AI 에이전트의 경우: 문서 인덱스는 https://www.mongodb.com/ko-kr/docs/llms.txt에서 사용할 수 있으며, 모든 페이지의 마크다운 버전은 어떤 URL 경로에 .md를 추가하여 사용할 수 있습니다.
See how MongoDB 9.0 delivers up to 2x higher throughput.
MongoDB Branding Shape
Register now >
Docs Menu

$topN (축적자 연산자)

$topN

지정된 정렬 순서에 따라 그룹 내 상위 n개 요소의 집계를 반환합니다. 그룹에 n개 미만의 요소가 포함된 경우 $topN은 그룹의 모든 요소를 반환합니다.

참고

$topN의 기타 용도

이 페이지에서는 축적자 사용되는 $topN 에 대해 설명합니다. 축적자는 입력 문서 그룹 에서 애그리게이션된 값을 반환합니다.

지정된 정렬 순서에 따라 특정 창 문서에서 상위 n 요소를 반환하는 $topN (window function)를 사용할 수도 있습니다.

{
$topN:
{
n: <expression>,
sortBy: { <field1>: <sort order>, <field2>: <sort order> ... },
output: <expression>
}
}
필드
유형
설명

n

표현식

그룹 반환되는 최대 결과 수를 결정합니다. n은 양의 정수로 평가되어야 합니다.

sortBy

문서

$sort와 유사한 구문을 사용하여 결과의 순서를 지정합니다. 파이프라인 출력의 문서 순서에는 영향을 주지 않습니다.

output

표현식

그룹 의 각 요소에 대한 출력을 지정합니다. 모든 표현식 가능합니다.

  • $topN null 값을 필터링하지 않습니다.

  • $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에 null score가 있습니다. 이 값은 모두 null로 간주됩니다.

  • playerId 및 score 필드는 output : ["$playerId"," $score"]로 지정되고 배열 값으로 반환됩니다.

  • sortBy: { "score" : 1 } 때문에 null 값은 반환된 playerId 배열 앞에 정렬됩니다.

[
{
_id: 'G1',
playerId: [ [ 'PlayerD', null ], [ 'PlayerE', null ], [ 'PlayerA', 1 ] ]
}
]

서로 다른 유형을 정렬할 때 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 에 로드하는 방법에 대한 자세한 내용은 샘플 데이터 세트 로드를 참조하세요. 샘플 데이터베이스를 수정한 경우 이 페이지의 예제를 실행 하려면 데이터베이스를 삭제하고 다시 만들어야 할 수 있습니다.

$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
}
}
}
}
] )

예시 파이프라인:

  • $match를 사용하여 imdb.rating 값을 포함하는 Short 동영상으로 입력을 제한합니다.

  • $group를 사용하여 일치하는 동영상을 단일 Short 그룹 에 배치합니다.

  • sortBy: { "imdb.rating": -1, title: 1 }를 사용하여 평점을 기준으로 영화의 순위를 매기고 title을 타이 브레이커로 사용합니다.

  • $topN가 output: [ "$title", "$imdb.rating" ]과 함께 반환하는 필드를 지정합니다.

  • $topN를 사용하여 n: 3와 일치하는 상위 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개 영화를 반환합니다.

  • $sort 및 $limit를 사용하여 처음 5개 장르를 알파벳순으로 표시합니다.

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 $match to keep only movies with G, PG, PG-13, or R content ratings that include an imdb.rating value.

  • $group를 사용하여 _id: { rated: "$rated" }로 콘텐츠 등급별로 결과를 그룹 합니다.

  • $topN가 output: { title: "$title", rating: "$imdb.rating" }과 함께 반환하는 필드를 지정합니다.

  • 콘텐츠 등급이 PG인 경우 n은 3입니다. 그렇지 않으면 n는 1가 됩니다.

  • sortBy: { "imdb.rating": -1 }를 사용하여 IMDb 점수를 기준으로 상위 n 영화를 찾습니다.

  • 콘텐츠 등급별로 결과를 알파벳순으로 정렬합니다.

이 페이지 평가하기