정의
cursor.sort(sort)중요
Mongo쉬 방법
이 페이지에서는 메서드를
mongosh설명합니다. 이는 Node.js와 같은 언어별 운전자 에 대한 설명서가 아닙니다.MongoDB API 드라이버의 경우 언어별 MongoDB 드라이버 설명서를 참조하세요.
쿼리 일치하는 문서를 반환하는 순서를 지정합니다.
sort()데이터베이스 에서 문서를 검색하기 전에 커서 에 를 적용 해야 합니다.
호환성
이 메서드는 다음 환경에서 호스팅되는 배포에서 사용할 수 있습니다.
- MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스
참고
이 명령은 모든 MongoDB Atlas 클러스터에서 지원됩니다. 모든 명령에 대한 Atlas 지원에 관해 자세히 알아보려면 지원되지 않는 명령을 참조하세요.
MongoDB Enterprise: MongoDB의 구독 기반 자체 관리 버전
MongoDB Community: MongoDB의 소스 사용 가능 무료 자체 관리 버전
구문
sort() 메서드에는 다음과 같은 매개 변수가 있습니다.
Parameter | 유형 | 설명 |
|---|---|---|
| 문서 | 결과 세트의 정렬 순서를 지정하는 문서입니다. |
sort 매개변수에는 다음과 같은 형식의 필드 및 값 쌍이 포함됩니다.
{ field: value }
정렬 문서는 기존 필드를 기준으로 오름차순 또는 내림차순 정렬을 지정하거나 텍스트 점수 메타데이터를 기준으로 정렬할 수 있습니다.
행동
제한
최대 32개의 키를 기준으로 정렬할 수 있습니다.
중복 필드가 포함된 정렬 패턴을 제공하면 오류가 발생합니다.
정렬 일관성
MongoDB는 특정 순서에 따라 문서를 컬렉션에 저장하지 않습니다. 중복 값이 포함된 필드를 정렬할 때 해당 값이 포함된 문서는 임의의 순서로 반환될 수 있습니다.
$sort 작업은 '안정 정렬'이 아니기 때문에 동일한 정렬 키를 가진 문서가 출력에서 입력과 동일한 순서를 그대로 유지한다는 보장이 없습니다.
정렬 기준에 지정된 필드가 두 문서에 없을 경우 그 문서들은 동일한 값으로 정렬됩니다. 두 문서는 어떤 순서로든 반환될 수 있습니다.
일관적인 정렬 순서가 필요한 경우 고유값이 포함된 필드를 정렬에 하나 이상 포함하세요. 이를 보장하는 가장 쉬운 방법은 정렬 쿼리에 _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.find().sort( { "borough": 1 } )
이 예시에서는 borough 필드에 Manhattan 및 Brooklyn에 대한 중복 값이 모두 포함되어 있으므로 정렬 순서가 일치하지 않을 수 있습니다. 문서는 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(즉, Manhattan 및 Brooklyn)의 중복 값을 포함하는 문서의 순서는 동일하지 않습니다.
일관적인 정렬을 달성하려면 고유한 값만 포함하는 필드 정렬에 추가하세요. 다음 명령은 메서드를 사용하여 sort() borough 필드 와 _id 필드 모두 정렬합니다.
db.restaurants.find().sort( { "borough": 1, "_id": 1 } )
_id 필드는 항상 고유한 값만 포함하도록 보장되므로 반환된 정렬 순서는 동일한 정렬을 여러 번 실행해도 항상 동일합니다.
중요
존재하지 않는 필드 기준으로 정렬할 때 MongoDB 특정 출력 순서를 보장하지 않습니다. 이러한 경우의 동작은 버전마다 변경될 수 있습니다.
오름차순/내림차순 정렬
정렬 매개변수에 정렬 기준으로 사용할 필드를 하나 이상 지정하고 1 또는 -1 값을 지정하여 각각 오름차순 또는 내림차순 정렬을 지정합니다.
다음 작업은 먼저 age 필드를 기준으로 내림차순으로 문서를 정렬한 다음 posts 필드를 기준으로 오름차순으로 정렬합니다.
db.users.find({ }).sort( { age : -1, posts: 1 } )
정렬 작업에서 서로 다른 BSON types 의 값을 비교할 때 MongoDB는 가장 낮은 것부터 가장 높은 것까지 다음과 같은 비교 순서를 사용합니다:
MinKey(내부 유형)
Null
숫자(정수, long, double, decimals)
기호, 문자열
객체
배열
BinData
ObjectId
부울
날짜
타임스탬프
정규 표현식
JavaScript 코드
범위가 있는 자바스크립트 코드
MaxKey(내부 유형)
특정 유형에 대한 비교/정렬 순서에 대한 자세한 내용은 비교/정렬 순서를 참조하세요.
텍스트 점수 메타데이터 정렬
참고
$text 자체 관리(비Atlas) 배포를 위한 텍스트 쿼리 기능을 제공합니다. MongoDB 에서 호스팅되는 데이터의 경우, MongoDB 향상된 전체 텍스트 쿼리 솔루션인 MongoDB Search.도 제공합니다.
$text를 사용하는 경우 { $meta: "textScore" } 표현식을 사용하여 관련성 점수를 내림차순으로 정렬할 수 있습니다.
다음 샘플 문서는 "textScore" 메타데이터를 기준으로 내림차순 정렬을 지정합니다.
db.users.find( { $text: { $search: "operating" } }, { score: { $meta: "textScore" }} ).sort({ score: { $meta: "textScore" } })
"textScore" 메타데이터는 내림차순으로 정렬됩니다.
자세한 내용은 $meta을(를) 참조하세요.
배열 필드로 정렬
MongoDB가 배열 값 필드에 따라 문서를 정렬할 때 정렬 키는 정렬이 오름차순인지 내림차순인지에 따라 달라집니다.
오름차순 정렬에서는 정렬 키는 배열에서 가장 낮은 값입니다.
내림차순 정렬에서 정렬 키는 배열에서 가장 높은 값입니다.
쿼리 필터는 정렬 키 선택에 영향을 미치지 않습니다.
예를 들어 다음 문서를 사용하여 shoes 컬렉션을 생성합니다.
db.shoes.insertMany( [ { _id: 'A', sizes: [ 7, 11 ] }, { _id: 'B', sizes: [ 8, 9, 10 ] } ] )
다음 쿼리는 sizes 필드를 기준으로 문서를 오름차순 및 내림차순으로 정렬합니다.
// Ascending sort db.shoes.find().sort( { sizes: 1 } ) // Descending sort db.shoes.find().sort( { sizes: -1 } )
앞선 두 쿼리는 모두 _id: 'A'인 문서를 먼저 반환합니다. 이는 sizes 배열 항목에서 크기 7과 11이 각각 가장 낮고 가장 높기 때문입니다.
배열 필드를 기준으로 필터링 및 정렬
배열을 포함하는 필드를 기준으로 필터링하고 정렬할 때, 필터는 정렬 키로 사용되는 값에 영향을 미치지 않습니다. 정렬은 항상 모든 배열 값을 잠재적인 정렬 키로 간주합니다.
예를 들어, 다음 쿼리는 사이즈가 9보다 큰 신발을 찾고 결과를 사이즈 기준으로 오름차순으로 정렬합니다.
db.shoes.find( { sizes: { $gt: 9 } } ).sort( { sizes: 1 } )
정렬 키는 오름차순이므로 sizes 배열에서 가장 낮은 값입니다.
_id: 'A'문서에서 가장 낮은sizes요소는7입니다. 이 값은{ sizes: { $gt: 9 }필터와 일치하지 않더라도 정렬 키로 사용됩니다._id: 'B'문서에서 가장 낮은sizes요소는8입니다. 마찬가지로, 이 값은 필터와 일치하지 않더라도 정렬 키로 사용됩니다.
쿼리는 _id: 'A'가 포함된 문서를 먼저 반환합니다.
팁
일치하는 값으로만 정렬
일치하는 값만 잠재적인 정렬 키로 고려하려면, 일치하는 값을 포함하는 새 필드를 생성하고 그 필드를 기준으로 정렬합니다. 자세한 정보는 다음 파이프라인 단계 및 표현식을 참조하세요.
정렬 및 인덱스 사용하기
컬렉션에 정렬 필드가 포함된 인덱스가 있는 경우 MongoDB는 해당 인덱스를 사용하여 정렬 작업의 결과를 얻을 수 있습니다. $or 쿼리에서는 $or 표현식의 각 절이 고유 인덱스를 사용할 수 있으므로 MongoDB는 단일 정렬 작업을 지원하기 위해 여러 개의 인덱스를 사용할 수 있습니다.
MongoDB 인덱스 또는 인덱스를 사용하여 정렬 순서를 가져올 수 없는 경우 MongoDB 데이터에 대해 메모리 내 정렬 작업을 수행해야 합니다.
인덱스 사용하는 정렬 작업은 인메모리 정렬보다 성능이 더 좋은 경우가 많습니다. 정렬 작업을 지원 인덱스를 만드는 방법에 대한 자세한 내용은 인덱스를 사용하여 쿼리 결과 정렬을 참조하세요.
MongoDB 인메모리 정렬을 수행해야 하는지 확인하려면 쿼리 에 cursor.explain() 를 추가하고 설명 결과를 확인합니다. 쿼리 계획 에 SORT 단계가 포함된 경우 MongoDB 메모리 내 정렬 작업을 수행해야 합니다.
인메모리 정렬이 너무 많은 메모리를 사용하지 않도록 하려면 다음을 수행합니다.
정렬 작업을 지원하는 인덱스를 생성합니다. 자세한 내용과 예시는 인덱스를 사용하여 쿼리 결과 정렬하기를 참조하세요.
와 함께 를
cursor.limit()cursor.sort()사용하여 정렬할 데이터의 양을 제한합니다. 자세한 내용과 예시는 결과 제한을 참조하세요.
결과 제한
를 와 함께 sort() limit() 사용하여 첫 번째(정렬 순서 측면에서) 문서를 반환할 수 있으며, 여기서 k k 는 지정된 제한입니다.
MongoDB가 인덱스 스캔으로 정렬 순서를 지정할 수 없는 경우, MongoDB는 상위 k개 정렬 알고리즘을 사용합니다. 이 알고리즘은 기본 인덱스 또는 컬렉션 액세스를 통해 확인된 첫 k 개의 결과(또는 정렬 순서에 따라 마지막 결과)를 버퍼링합니다. 이 k 개 결과의 메모리 사용량이 100 MB를 초과하는 경우, MongoDB는 쿼리에 cursor.allowDiskUse() 가 false 인 값으로 지정되지 않는 한(이 경우 쿼리가 실패합니다) 이상 임시 파일을 자동으로 디스크에 쓰기 (write)합니다.
프로젝션과의 상호 작용
작업이 동일한 필드를 사용하여 정렬 및 프로젝션 을 모두 수행하는 경우 MongoDB 프로젝션 적용하기 전에 원래 필드 값을 정렬합니다.
예시
orders 컬렉션에 포함된 문서는 다음과 같습니다.
db.orders.insertMany( [ { _id: 1, item: { category: "cake", type: "chiffon" }, amount: 10 }, { _id: 2, item: { category: "cookies", type: "chocolate chip" }, amount: 50 }, { _id: 3, item: { category: "cookies", type: "chocolate chip" }, amount: 15 }, { _id: 4, item: { category: "cake", type: "lemon" }, amount: 30 }, { _id: 5, item: { category: "cake", type: "carrot" }, amount: 20 }, { _id: 6, item: { category: "brownies", type: "blondie" }, amount: 10 } ] )
orders collection에서 모든 문서를 반환하는 다음 쿼리는 정렬 순서를 지정하지 않습니다.
db.orders.find()
쿼리는 문서를 불확실한 순서로 반환합니다.
{ _id: 1, item: { category: "cake", type: "chiffon" }, amount: 10 } { _id: 2, item: { category: "cookies", type: "chocolate chip" }, amount: 50 } { _id: 3, item: { category: "cookies", type: "chocolate chip" }, amount: 15 } { _id: 4, item: { category: "cake", type: "lemon" }, amount: 30 } { _id: 5, item: { category: "cake", type: "carrot" }, amount: 20 } { _id: 6, item: { category: "brownies", type: "blondie" }, amount: 10 }
다음 쿼리는 amount 필드에서 내림차순으로 정렬을 지정합니다.
db.orders.find().sort( { amount: -1 } )
쿼리는 다음 문서를 amount의 내림차순으로 반환합니다.
{ _id: 2, item: { category: "cookies", type: "chocolate chip" }, amount: 50 } { _id: 4, item: { category: "cake", type: "lemon" }, amount: 30 } { _id: 5, item: { category: "cake", type: "carrot" }, amount: 20 } { _id: 3, item: { category: "cookies", type: "chocolate chip" }, amount: 15 } { _id: 1, item: { category: "cake", type: "chiffon" }, amount: 10 } { _id: 6, item: { category: "brownies", type: "blondie" }, amount: 10 }
다음 쿼리는 내장된 문서 item의 필드를 사용하여 정렬 순서를 지정합니다. 쿼리는 먼저 category 필드를 기준으로 오름차순으로 정렬한 다음 각 category내에서 type 필드를 기준으로 오름차순으로 정렬합니다.
db.orders.find().sort( { "item.category": 1, "item.type": 1 } )
쿼리는 category 필드를 기준으로 먼저 정렬되고 각 카테고리 내에서 type 필드를 기준으로 정렬된 다음 문서를 반환합니다.
{ _id: 6, item: { category: "brownies", type: "blondie" }, amount: 10 } { _id: 5, item: { category: "cake", type: "carrot" }, amount: 20 } { _id: 1, item: { category: "cake", type: "chiffon" }, amount: 10 } { _id: 4, item: { category: "cake", type: "lemon" }, amount: 30 } { _id: 2, item: { category: "cookies", type: "chocolate chip" }, amount: 50 } { _id: 3, item: { category: "cookies", type: "chocolate chip" }, amount: 15 }
기본 순서로 반환
$natural 매개변수는 데이터베이스 내의 기본 순서에 따라 항목을 반환합니다. 이 순서는 내부적으로 구현된 기능이며, 문서의 특정 순서에 의존해서는 안 됩니다.
참고
인덱스 사용하기
$natural에 따른 정렬을 포함하는 쿼리의 경우 다음의 경우를 제외하고 쿼리의 술어에 인덱스를 사용하지 않습니다: _id 필드에 { _id: <value> }와 '같음' 조건이 설정되어 있는 쿼리 술어의 경우, $natural에 따른 정렬을 포함하는 쿼리에 _id 인덱스를 사용할 수 있습니다.