문서 메뉴

문서 홈애플리케이션 개발MongoDB 매뉴얼

$sort (aggregation)

이 페이지의 내용

  • 정의
  • 호환성
  • 구문
  • 행동
  • 예제
  • $sort 연산자 및 메모리
  • $sort 연산자 및 성능
$sort

모든 입력 문서를 정렬하고 정렬된 순서대로 파이프라인에 반환합니다.

다음 환경에서 호스팅되는 배포에 $sort 사용할 수 있습니다.

  • MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스

$sort 단계의 프로토타입 형식은 다음과 같습니다.

{ $sort: { <field1>: <sort order>, <field2>: <sort order> ... } }

$sort 은 정렬 기준으로 사용할 필드와 해당 정렬 순서를 지정하는 문서를 사용합니다. <sort order> 는 다음 값 중 하나를 가질 수 있습니다.

설명
1
오름차순으로 정렬합니다.
-1
내림차순으로 정렬합니다.
{ $meta: "textScore" }
계산된 textScore 메타데이터를 내림차순으로 정렬합니다.
주문. 예제는 텍스트 점수 메타데이터 정렬 을 참조하세요.

여러 필드에서 정렬하는 경우 정렬 순서는 왼쪽에서 오른쪽으로 평가됩니다. 예를 들어 위 형식에서 문서는 먼저 <field1> 기준으로 정렬됩니다. 그런 다음 동일한 <field1> 값을 가진 문서가 <field2>를 기준으로 더 정렬됩니다.

최대 32개의 키를 기준으로 정렬할 수 있습니다.

MongoDB는 특정 순서에 따라 문서를 컬렉션에 저장하지 않습니다. 중복 값이 포함된 필드를 정렬할 때 해당 값이 포함된 문서는 임의의 순서로 반환될 수 있습니다.

일관적인 정렬 순서가 필요한 경우 고유값이 포함된 필드를 정렬에 하나 이상 포함하세요. 이를 보장하는 가장 쉬운 방법은 정렬 쿼리에 _id 필드를 포함하는 것입니다.

다음의 restaurant 컬렉션을 고려해 보세요.

db.restaurants.insertMany( [
{ "_id" : 1, "name" : "Central Park Cafe", "borough" : "Manhattan"},
{ "_id" : 2, "name" : "Rock A Feller Bar and Grill", "borough" : "Queens"},
{ "_id" : 3, "name" : "Empire State Pub", "borough" : "Brooklyn"},
{ "_id" : 4, "name" : "Stan's Pizzaria", "borough" : "Manhattan"},
{ "_id" : 5, "name" : "Jane's Deli", "borough" : "Brooklyn"},
] )

다음 명령은 $sort 단계를 사용하여 borough 필드를 정렬합니다.

db.restaurants.aggregate(
[
{ $sort : { borough : 1 } }
]
)

이 예제에서는 borough 필드에 ManhattanBrooklyn에 대한 중복 값이 모두 포함되어 정렬 순서가 일치하지 않을 수 있습니다. 문서는 borough의 알파벳순로 반환되지만 borough의 중복 값을 포함하는 문서의 순서는 동일한 정렬을 여러 번 실행할 때 동일하지 않을 수 있습니다. 예를 들어 위 명령을 두 번 실행한 결과는 다음과 같습니다.

{ "_id" : 3, "name" : "Empire State Pub", "borough" : "Brooklyn" }
{ "_id" : 5, "name" : "Jane's Deli", "borough" : "Brooklyn" }
{ "_id" : 1, "name" : "Central Park Cafe", "borough" : "Manhattan" }
{ "_id" : 4, "name" : "Stan's Pizzaria", "borough" : "Manhattan" }
{ "_id" : 2, "name" : "Rock A Feller Bar and Grill", "borough" : "Queens" }
{ "_id" : 5, "name" : "Jane's Deli", "borough" : "Brooklyn" }
{ "_id" : 3, "name" : "Empire State Pub", "borough" : "Brooklyn" }
{ "_id" : 4, "name" : "Stan's Pizzaria", "borough" : "Manhattan" }
{ "_id" : 1, "name" : "Central Park Cafe", "borough" : "Manhattan" }
{ "_id" : 2, "name" : "Rock A Feller Bar and Grill", "borough" : "Queens" }

borough 값은 여전히 알파벳순으로 정렬되지만 borough(즉, ManhattanBrooklyn)의 중복 값을 포함하는 문서의 순서는 동일하지 않습니다.

일관된 정렬 을 달성하려면 고유한 값만 포함하는 필드를 정렬에 추가합니다. 다음 명령은 $sort 단계를 사용하여 borough 필드와 _id 필드를 모두 정렬합니다.

db.restaurants.aggregate(
[
{ $sort : { borough : 1, _id: 1 } }
]
)

_id 필드는 항상 고유한 값만 포함하도록 보장되므로 반환된 정렬 순서는 동일한 정렬을 여러 번 실행해도 항상 동일합니다.

정렬 기준이 되는 필드에 대해 다음 예제에서와 같이 정렬 순서를 1 또는 -1로 설정하여 각각 오름차순 또는 내림차순 정렬을 지정합니다.

db.users.aggregate(
[
{ $sort : { age : -1, posts: 1 } }
]
)

이 작업은 users collection에 있는 문서를 age 필드에 따라 내림차순으로 정렬한 다음 posts 필드의 값에 따라 오름차순으로 정렬합니다.

정렬 작업에서 서로 다른 BSON types 의 값을 비교할 때 MongoDB는 가장 낮은 것부터 가장 높은 것까지 다음과 같은 비교 순서를 사용합니다:

  1. MinKey(내부 유형)

  2. Null

  3. 숫자(정수, long, double, decimals)

  4. 기호, 문자열

  5. 개체

  6. 배열

  7. BinData

  8. 객체 ID

  9. 부울

  10. 날짜

  11. 타임스탬프

  12. 정규 표현식

  13. MaxKey(내부 유형)

특정 유형에 대한 비교/정렬 순서에 대한 자세한 내용은 비교/정렬 순서를 참조하세요.

$text 검색의 경우 { $meta: "textScore" } 표현식을 사용하여 관련성 점수를 내림차순으로 정렬할 수 있습니다. { <sort-key> } 문서에서 { $meta: "textScore" } 표현식을 임의의 필드 이름으로 설정합니다. 필드 이름은 쿼리 시스템에서 무시됩니다. 예시:

db.users.aggregate(
[
{ $match: { $text: { $search: "operating" } } },
{ $sort: { score: { $meta: "textScore" }, posts: -1 } }
]
)

이 작업은 $text 연산자를 사용하여 문서를 일치시킨 다음 "textScore" 메타데이터를 기준으로 내림차순으로 정렬한 다음 posts 필드를 기준으로 내림차순으로 정렬합니다. 정렬 문서의 score 필드 이름은 쿼리 시스템에서 무시됩니다. 이 파이프라인에서 "textScore" 메타데이터는 프로젝션에 포함되지 않으며 일치하는 문서의 일부로 반환되지 않습니다. 자세한 내용은 $meta를 참조하십시오.

$sort$limit } 앞에 오고 문서 수를 수정하는 중간 단계가 없는 경우, 옵티마이저는 $limit$sort 로 병합할 수 있습니다. 이렇게 하면 $sort 작업이 진행되는 동안 상위 n 결과만 유지할 수 있으며(여기서 n 는 지정된 제한임), MongoDB는 메모리에 n 항목만 저장하면 됩니다. 이 최적화는 allowDiskUsetrue 이고 n 항목이 애그리게이션 메모리 제한을 초과하는 경우에도 여전히 적용됩니다.

최적화는 릴리스 간에 변경될 수 있습니다.

$sort 는 100메가바이트의 메모리 사용 제한을 받지만, 필요한 경우 추가 공간을 위해 임시 파일을 디스크에 쓸 수 있습니다.

MongoDB 6.0부터는 실행에 100메가바이트 이상의 메모리가 필요한 파이프라인 단계는 기본적으로 임시 파일을 디스크에 기록합니다. MongoDB의 이전 버전에서는 이 동작을 활성화하려면 개별 findaggregate 명령에 { allowDiskUse: true } 를 전달해야 합니다.

개별 findaggregate 명령은 다음 방법 중 하나를 통해allowDiskUseByDefault 매개변수를 재정의할 수 있습니다:

  • 1}이 로 설정된 경우 을 사용하여 임시 파일을 디스크에 쓰는 것을 허용합니다.{ allowDiskUse: true } allowDiskUseByDefault false

  • 1}이 로 설정된 경우 을 사용하여 임시 파일을 디스크에 쓰는 것을 금지합니다.{ allowDiskUse: false } allowDiskUseByDefault true

다음도 참조하세요.

$sort 연산자는 파이프라인의 첫 번째 단계에서 사용되거나 $match 단계 앞에만 사용되는 경우 인덱스를 활용할 수 있습니다.

샤드 클러스터에서 $sort 를 사용하면 각 샤드는 사용 가능한 경우 인덱스를 사용하여 결과 문서를 정렬합니다. 그런 다음 mongos 또는 샤드 중 하나가 스트리밍 병합 정렬을 수행합니다.

← $skip (aggregation)