정의
호환성
다음 환경에서 호스팅되는 배포에 $sort 사용할 수 있습니다.
- MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스
MongoDB Enterprise: MongoDB의 구독 기반 자체 관리 버전
MongoDB Community: MongoDB의 소스 사용 가능 무료 자체 관리 버전
구문
$sort 의 형식은 다음과 같습니다.
{ $sort: { <field1>: <sort order>, <field2>: <sort order> ... } }
$sort 정렬 기준으로 사용할 필드와 정렬 순서를 지정하는 문서 사용합니다. <sort order>은 다음 값 중 하나를 가질 수 있습니다:
값 | 설명 |
|---|---|
| 오름차순으로 정렬합니다. |
| 내림차순으로 정렬합니다. |
| 계산된 |
여러 필드를 정렬할 때 $sort는 왼쪽에서 오른쪽으로 정렬 순서를 평가합니다. 문서가 먼저 <field1> 기준으로 정렬된 다음, 동일한 <field1> 값을 가진 문서가 <field2> 기준으로 정렬됩니다.
행동
성능
$sort 데이터를 처리하기 전에 파이프라인이 블로킹 단계에서 모든 입력 데이터가 조회될 때까지 대기하도록 하는 블로킹 단계입니다. 블로킹 단계는 여러 단계가 있는 파이프라인에 대한 병렬 처리를 줄이기 때문에 성능을 저하시킬 수 있습니다. 블로킹 단계는 대규모 데이터 세트에 대해 상당한 양의 메모리를 사용할 수도 있습니다.
제한
최대 32개의 키를 기준으로 정렬할 수 있습니다.
중복 필드가 포함된 정렬 패턴을 제공하면 오류가 발생합니다.
정렬 일관성
MongoDB는 특정 순서에 따라 문서를 컬렉션에 저장하지 않습니다. 중복 값이 포함된 필드를 정렬할 때 해당 값이 포함된 문서는 임의의 순서로 반환될 수 있습니다.
$sort 작업은 '안정 정렬'이 아니기 때문에 동일한 정렬 키를 가진 문서가 출력에서 입력과 동일한 순서를 그대로 유지한다는 보장이 없습니다.
정렬 기준에 지정된 필드가 두 문서에 없을 경우 그 문서들은 동일한 값으로 정렬됩니다. 두 문서는 어떤 순서로든 반환될 수 있습니다.
일관적인 정렬 순서가 필요한 경우 고유값이 포함된 필드를 정렬에 하나 이상 포함하세요. 이를 보장하는 가장 쉬운 방법은 정렬 쿼리에 _id 필드를 포함하는 것입니다.
sample_mflix 샘플 데이터 세트의 movies 컬렉션 생각해 보세요. 다음 명령은 1925 또는 1926에서 개봉된 영화를 year를 기준으로 오름차순으로 정렬합니다:
db.movies.aggregate( [ { $match: { year: { $in: [ 1925, 1926 ] } } }, { $sort: { year: 1 } }, { $project: { _id: 0, title: 1, year: 1 } } ] )
year 필드 1925 및 1926에 대한 중복 값이 있기 때문에 동일한 값을 가진 문서라도 실행마다 다르게 정렬될 수 있습니다. 예시 를 들어, 이전 명령을 두 번 실행하면 서로 다른 순서가 생성됩니다.
[ { title: "Clash of the Wolves", year: 1925 }, { title: "Lady Windermere's Fan", year: 1925 }, { title: "Grass: A Nation's Battle for Life", year: 1925 }, { title: "Beau Geste", year: 1926 }, { title: "The Black Pirate", year: 1926 }, { title: "Ella Cinders", year: 1926 }, { title: "For Heaven's Sake", year: 1926 }, { title: "The Son of the Sheik", year: 1926 }, { title: "The Strong Man", year: 1926 } ]
[ { title: "Lady Windermere's Fan", year: 1925 }, { title: "Grass: A Nation's Battle for Life", year: 1925 }, { title: "Clash of the Wolves", year: 1925 }, { title: "The Strong Man", year: 1926 }, { title: "The Black Pirate", year: 1926 }, { title: "Ella Cinders", year: 1926 }, { title: "Beau Geste", year: 1926 }, { title: "The Son of the Sheik", year: 1926 }, { title: "For Heaven's Sake", year: 1926 } ]
작업은 year 값을 오름차순으로 정렬하지만 year에 대한 중복 값을 포함하는 문서의 순서는 동일하지 않습니다. 예시 들어 1925 및 1926의 값을 중복합니다.
일관적인 정렬을 달성하려면 고유 값만 포함된 필드 정렬에 추가하세요. 다음 명령은 year 필드 와 _id 필드 모두 정렬합니다.
db.movies.aggregate( [ { $match: { year: { $in: [ 1925, 1926 ] } } }, { $sort: { year: 1, _id: 1 } } ] )
_id 필드 항상 고유 값이 포함되며 정렬 순서는 여러 정렬 실행에서 일관적인 됩니다.
배열 필드로 정렬
MongoDB가 배열 값 필드에 따라 문서를 정렬할 때 정렬 키는 정렬이 오름차순인지 내림차순인지에 따라 달라집니다.
오름차순 정렬에서는 정렬 키는 배열에서 가장 낮은 값입니다.
내림차순 정렬에서 정렬 키는 배열에서 가장 높은 값입니다.
쿼리 필터는 정렬 키 선택에 영향을 미치지 않습니다.
예시 들어 sample_mflix 샘플 데이터 세트의 movies 컬렉션 에 있는 다음 문서를 고려하세요.
{ _id: ObjectId("573a1395f29313caabce166c"), title: "The Comancheros", genres: [ "Action", "Western", "Adventure" ] } { _id: ObjectId("573a1391f29313caabcd8521"), title: "The Son of the Sheik", genres: [ "Adventure", "Drama" ] }
다음 쿼리는 genres 필드를 기준으로 문서를 오름차순 및 내림차순으로 정렬합니다.
// Ascending sort db.movies.aggregate( [ { $match: { title: { $in: [ "The Comancheros", "The Son of the Sheik" ] } } }, { $sort: { genres: 1 } } ] )
// Descending sort db.movies.aggregate( [ { $match: { title: { $in: [ "The Comancheros", "The Son of the Sheik" ] } } }, { $sort: { genres: -1 } } ] )
앞의 쿼리 모두 Action 및 Western 이 genres 배열 에서 가장 낮은 항목과 가장 높은 항목이기 때문에 The Comancheros 을 먼저 반환합니다.
배열 필드를 기준으로 필터링 및 정렬
배열을 포함하는 필드를 기준으로 필터링하고 정렬할 때, 필터는 정렬 키로 사용되는 값에 영향을 미치지 않습니다. 정렬은 항상 모든 배열 값을 잠재적인 정렬 키로 간주합니다.
예시 들어, 다음 쿼리 genres 배열 에 "Drama" 또는 "Western"가 포함된 영화를 찾고 결과를 genres을 기준으로 오름차순으로 정렬합니다:
db.movies.aggregate( [ { $match: { title: { $in: [ "The Comancheros", "The Son of the Sheik" ] }, genres: { $in: [ "Drama", "Western" ] } } }, { $sort: { genres: 1 } } ] )
정렬은 오름차순입니다. 정렬 키는 알파벳순으로 정렬할 때 genres 배열 의 첫 번째 값입니다.
The Comancheros에서 첫 번째genres요소는Action입니다. 이 값은 필터하다{ genres: { $in: [ "Drama", "Western" ] } }와 일치하지 않더라도 정렬 키로 사용됩니다.The Son of the Sheik에서 첫 번째genres요소는Adventure입니다. 마찬가지로, 이 작업은 필터하다 와 일치하지 않더라도Adventure를 정렬 키로 사용합니다.
쿼리 The Comancheros을 먼저 반환합니다.
팁
일치하는 값으로만 정렬
일치하는 값만 잠재적인 정렬 키로 고려하려면, 일치하는 값을 포함하는 새 필드를 생성하고 그 필드를 기준으로 정렬합니다. 자세한 정보는 다음 파이프라인 단계 및 표현식을 참조하세요.
$sort 연산자 및 메모리
$sort 및 $limit 메모리 최적화
$sort가 $limit 앞에 오고 문서 수를 수정하는 중간 단계가 없을 경우, 옵티마이저는 $limit를 $sort에 병합할 수 있습니다. 이렇게 하면 $sort 연산을 진행하는 과정에서 상위 n개의 결과만 유지할 수 있고(여기서 n은 지정된 제한값 의미), MongoDB는 메모리에 n개의 항목만 저장하면 됩니다. 이 최적화는 allowDiskUse가 true이고 n항목이 집계 메모리 제한을 초과하는 경우에도 여전히 적용됩니다.
최적화는 릴리스 간에 변경될 수 있습니다.
$sort 및 메모리 제한
실행하는 데 100 메가바이트 이상의 메모리가 필요한 파이프라인 단계는 기본값 으로 임시 파일을 디스크에 쓰기 (write) . 이러한 임시 파일은 파이프라인 실행 기간 동안 지속되며 인스턴스 의 저장 공간에 영향을 줄 수 있습니다.
개별 find 및 aggregate 명령은 다음 방법 중 하나를 통해 allowDiskUseByDefault 매개변수를 재정의할 수 있습니다:
1}이 로 설정된 경우 을 사용하여 임시 파일을 디스크에 쓰는 것을 허용합니다.
{ allowDiskUse: true }allowDiskUseByDefaultfalse1}이 로 설정된 경우 을 사용하여 임시 파일을 디스크에 쓰는 것을 금지합니다.
{ allowDiskUse: false }allowDiskUseByDefaulttrue
참고
MongoDB Atlas 의 경우, 장기 실행 쿼리가 저장 를 임시 파일로 채우지 않도록 저장 자동 확장 을 구성 하는 것이 좋습니다.
Atlas cluster 가 저장 자동 확장 을 사용하는 경우, 임시 파일로 인해 클러스터 가 다음 저장 계층 으로 확장하다 될 수 있습니다.
자세한 내용은 집계 파이프라인 제한을 참조하세요.
$sort 인덱스 사용
$sort 연산자 파이프라인 의 첫 번째 단계이거나 $match 단계만 앞에 오는 경우 인덱스 를 사용할 수 있습니다.
샤딩된 클러스터 에서 $sort 을(를) 사용하면 각 샤드 사용 가능한 경우 인덱스 사용하여 결과 문서를 정렬합니다. 그런 다음 mongos 또는 샤드 중 하나가 스트리밍 병합 정렬을 수행합니다.
예시
이 페이지의 예제에서는 sample_mflix 데이터 세트의 데이터를 사용합니다. 이 데이터 세트를 자체 관리형 MongoDB deployment 에 로드하는 방법에 대한 자세한 내용은 샘플 데이터 세트 로드를 참조하세요. 샘플 데이터베이스를 수정한 경우 이 페이지의 예제를 실행 하려면 데이터베이스를 삭제하고 다시 만들어야 할 수 있습니다.
오름차순 및 내림차순 정렬
각 정렬 필드 에 대해 값을 오름차순의 경우 1 로, 내림차순의 경우 -1 로 설정하다 . 예시 들면 다음과 같습니다.
db.movies.aggregate( [ { $sort: { year: -1, title: 1 } }, { $limit: 5 } ] )
이 작업은 movies 컬렉션 의 문서를 year 기준으로 내림차순으로 정렬한 다음 title 기준으로 오름차순으로 정렬하고 처음 5개의 결과를 반환합니다.
정렬 작업에서 서로 다른 BSON types 의 값을 비교할 때 MongoDB는 가장 낮은 것부터 가장 높은 것까지 다음과 같은 비교 순서를 사용합니다:
MinKey(내부 유형)
Null
숫자(정수, long, double, decimals)
기호, 문자열
객체
배열
BinData
ObjectId
부울
날짜
타임스탬프
정규 표현식
JavaScript 코드
범위가 있는 자바스크립트 코드
MaxKey(내부 유형)
특정 유형에 대한 비교/정렬 순서에 대한 자세한 내용은 비교/정렬 순서를 참조하세요.
텍스트 점수 메타데이터 정렬
참고
$text 자체 관리(비Atlas) 배포를 위한 텍스트 쿼리 기능을 제공합니다. MongoDB 에서 호스팅되는 데이터의 경우, MongoDB 향상된 전체 텍스트 쿼리 솔루션인 MongoDB Search.도 제공합니다.
다음 예시 sample_mflix 샘플 데이터 세트의 movies 컬렉션 사용합니다. 실행 전에 plot 필드 에 텍스트 인덱스 생성합니다.
db.movies.createIndex( { plot: "text" } )
$text를 포함하는 파이프라인의 경우 { $meta: "textScore" } 표현식을 사용하여 관련성 점수를 내림차순으로 정렬할 수 있습니다. { <sort-key> } 문서에서 { $meta: "textScore" } 표현식을 임의의 필드 이름으로 설정합니다. 필드 이름은 쿼리 시스템에서 무시됩니다. 예시:
db.movies.aggregate( [ { $match: { $text: { $search: "pirate" } } }, { $sort: { score: { $meta: "textScore" }, year: -1 } }, { $limit: 5 } ] )
이 작업은 $text이 있는 문서를 일치시킨 다음 "textScore" 메타데이터 및 year를 기준으로 내림차순으로 정렬하고 처음 5개의 결과를 반환합니다. 정렬 문서 의 score 필드 이름은 쿼리 시스템에서 무시됩니다. 프로젝션 "textScore" 메타데이터 포함하지 않으며, 일치하는 문서의 일부로 메타데이터 반환하지 않습니다. 자세한 내용은 $meta을(를) 참조하세요.
이 페이지의 C# 예제에서는 Atlas 샘플 데이터 세트의 sample_mflix 데이터베이스 사용합니다. 무료 MongoDB Atlas cluster 생성하고 샘플 데이터 세트를 로드하는 방법을 학습하려면 MongoDB .NET/ C# 드라이버 문서에서 시작하기 를 참조하세요.
다음 Movie 클래스는 sample_mflix.movies 컬렉션의 문서를 모델링합니다.
[] public class Movie { [] public ObjectId Id { get; set; } [] public string Title { get; set; } = null!; [] public int? Year { get; set; } [] public int? Runtime { get; set; } [] public string? Rated { get; set; } [] public int Metacritic { get; set; } [] public string? Plot { get; set; } [] public string? Type { get; set; } [] public string[]? Cast { get; set; } [] public string[]? Directors { get; set; } [] public string[]? Writers { get; set; } [] public ImdbData? Imdb { get; set; } }
MongoDB .NET/ C# 운전자 사용하여 $sort 집계 파이프라인 에 단계를 추가하려면 PipelineDefinition 객체 에서 UnionWith() 메서드를 호출합니다.
다음 예시는 먼저 Metacritic 이 100와 같은 Movie 문서를 필터링한 다음 Year 필드 기준으로 내림차순으로 정렬한 다음 Title 필드 기준으로 오름차순으로 정렬하는 파이프라인 단계를 만듭니다.
var pipeline = new EmptyPipelineDefinition<Movie>() .Match(Builders<Movie>.Filter.Eq(m => m.Metacritic, 100)) .Sort(Builders<Movie>.Sort.Combine( Builders<Movie>.Sort.Descending(m => m.Year), Builders<Movie>.Sort.Ascending(m => m.Title)));
MongoDB Node.js 운전자 사용하여 집계 파이프라인 에 $sort 단계를 추가하려면 파이프라인 객체 에서 $sort 연산자 사용합니다.
다음 예시에서는 입력 movie 문서를 year 필드 기준으로 내림차순으로 정렬한 후, title 필드를 기준으로 오름차순 정렬하는 파이프라인 단계를 만듭니다. 그리고 집계 파이프라인을 실행합니다.
const pipeline = [{ $sort: { year: -1, title: 1 } }]; const cursor = collection.aggregate(pipeline); return cursor;
자세히 알아보기
$sort를 사용하는 전체 집계 예시는 전체 집계 파이프라인 튜토리얼을 참조하세요.