Docs Menu
Docs Home
/
MongoDB 매뉴얼
/ / /

top(집계 누산기)

이 페이지의 내용

  • 정의
  • 구문
  • 행동
  • 제한 사항
  • 예시
$top

버전 5.2에 추가되었습니다.

지정된 정렬 순서에 따라 그룹 내 최상위 요소를 반환합니다.

{
$top:
{
sortBy: { <field1>: <sort order>, <field2>: <sort order> ... },
output: <expression>
}
}
필드
필요성
설명
sortBy
필수 사항
$sort 과 유사한 구문을 사용하여 결과의 순서를 지정합니다.
출력
필수 사항
그룹의 각 요소에 대한 출력을 나타내며 모든 표현식이 될 수 있습니다.

점수 그룹에서 최상위 문서를 반환하는 다음 집계를 가정해 보겠습니다.

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

  • $top 누락된 값을 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:
{
$top:
{
output: [ "$playerId", "$score" ],
sortBy: { "score": 1 }
}
}
}
}
] )

이 예시에서는

  • $documents 플레이어 점수가 포함된 리터럴 문서를 생성합니다.

  • $groupgameId 기준으로 문서를 그룹화합니다. 이 예시에는 gameId가 단 하나(G1)만 있습니다.

  • PlayerD 점수가 누락되었고 PlayerE에 null score가 있습니다. 이 값은 모두 null로 간주됩니다.

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

  • sortBy: { "score": 1 }로 정렬 순서를 지정합니다.

  • PlayerDPlayerE가 동률로 상위 요소를 차지했습니다. PlayerD가 상위 score로 반환됩니다.

  • 여러 null 값에 대해 더 결정론적인 타이 브레이킹 동작을 수행하려면 sortBy 에 더 많은 필드를 추가합니다.

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

$top 집계 표현식으로 지원되지 않습니다.

$topwindow operator로 지원됩니다.

$top을 호출하는 집계 파이프라인에는 100MB 제한이 적용됩니다. 개별 그룹에 대해 이 제한을 초과하면 오류가 발생하면서 집계가 실패합니다.

다음 문서가 포함된 gamescores collection을 생각해 보세요.

db.gamescores.insertMany([
{ playerId: "PlayerA", gameId: "G1", score: 31 },
{ playerId: "PlayerB", gameId: "G1", score: 33 },
{ playerId: "PlayerC", gameId: "G1", score: 99 },
{ playerId: "PlayerD", gameId: "G1", score: 1 },
{ playerId: "PlayerA", gameId: "G2", score: 10 },
{ playerId: "PlayerB", gameId: "G2", score: 14 },
{ playerId: "PlayerC", gameId: "G2", score: 66 },
{ playerId: "PlayerD", gameId: "G2", score: 80 }
])

$top 축적자를 사용하여 단일 게임에서 최고 점수를 찾을 수 있습니다.

db.gamescores.aggregate( [
{
$match : { gameId : "G1" }
},
{
$group:
{
_id: "$gameId",
playerId:
{
$top:
{
output: [ "$playerId", "$score" ],
sortBy: { "score": -1 }
}
}
}
}
] )

예시 파이프라인:

  • $match를 사용하여 단일 gameId 결과를 필터링합니다. 이 경우에는 G1입니다.

  • $group을 사용하여 gameId를 기준으로 결과를 그룹화합니다. 이 경우에는 G1입니다.

  • output : ["$playerId"," $score"]을 사용하여 $top에 출력되는 필드를 지정합니다.

  • sortBy: { "score": -1 }을 사용하여 점수를 내림차순으로 정렬합니다.

  • $top을 사용하여 게임 내 최고 점수를 반환합니다.

이 연산은 다음과 같은 결과를 반환합니다.

[ { _id: 'G1', playerId: [ 'PlayerC', 99 ] } ]

$top 축적자를 사용하여 각 게임에서 상위 score를 찾을 수 있습니다.

db.gamescores.aggregate( [
{
$group:
{ _id: "$gameId", playerId:
{
$top:
{
output: [ "$playerId", "$score" ],
sortBy: { "score": -1 }
}
}
}
}
] )

예시 파이프라인:

  • $group을 사용하여 gameId를 기준으로 결과를 그룹화합니다.

  • $top을 사용하여 각 게임에서 상위 score를 반환합니다.

  • output : ["$playerId", "$score"]을 사용하여 $top에 출력되는 필드를 지정합니다.

  • sortBy: { "score": -1 }을 사용하여 점수를 내림차순으로 정렬합니다.

이 연산은 다음과 같은 결과를 반환합니다.

[
{ _id: 'G2', playerId: [ 'PlayerD', 80 ] },
{ _id: 'G1', playerId: [ 'PlayerC', 99 ] }
]

돌아가기

$toObjectId