cursor.sort()
정의
cursor.sort(sort)
중요
Mongo쉬 방법
이 페이지에서는
mongosh
메서드를 설명합니다. 이는 Node.js와 같은 언어별 드라이버에 대한 설명서가 아닙니다.MongoDB API 드라이버의 경우 언어별 MongoDB 드라이버 설명서를 참조하세요.
쿼리에서 일치하는 문서를 반환하는 순서를 지정합니다. 데이터베이스에서 문서를 검색하기 전에 커서에
sort()
를 적용해야 합니다.
호환성
다음 환경에서 호스팅되는 배포에 cursor.sort(sort)
사용할 수 있습니다.
MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스
MongoDB Enterprise: MongoDB의 구독 기반 자체 관리 버전
MongoDB Community: MongoDB의 소스 사용 가능 무료 자체 관리 버전
구문
sort()
메서드에는 다음과 같은 매개변수가 있습니다.
Parameter | 유형 | 설명 |
---|---|---|
sort | 문서 | 결과 세트의 정렬 순서를 지정하는 문서입니다. |
sort
매개변수에는 다음과 같은 형식의 필드 및 값 쌍이 포함됩니다.
{ field: value }
정렬 문서는 기존 필드에 대한 오름차순 또는 내림차순 정렬을 지정하거나 텍스트 점수 메타데이터에 대한 정렬을 지정할 수 있습니다.
행동
제한
최대 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.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
필드는 항상 고유한 값만 포함하도록 보장되므로 반환된 정렬 순서는 동일한 정렬을 여러 번 실행해도 항상 동일합니다.
오름차순/내림차순 정렬
정렬 매개변수에 정렬 기준으로 사용할 필드를 하나 이상 지정하고 1
또는 -1
값을 지정하여 각각 오름차순 또는 내림차순 정렬을 지정합니다.
다음 작업은 먼저 age
필드를 기준으로 내림차순으로 문서를 정렬한 다음 posts
필드를 기준으로 오름차순으로 정렬합니다.
db.users.find({ }).sort( { age : -1, posts: 1 } )
정렬 작업에서 서로 다른 BSON types 의 값을 비교할 때 MongoDB는 가장 낮은 것부터 가장 높은 것까지 다음과 같은 비교 순서를 사용합니다:
MinKey(내부 유형)
Null
숫자(정수, long, double, decimals)
기호, 문자열
객체
배열
BinData
ObjectId
부울
날짜
타임스탬프
정규 표현식
MaxKey(내부 유형)
특정 유형에 대한 비교/정렬 순서에 대한 자세한 내용은 비교/정렬 순서를 참조하세요.
텍스트 점수 메타데이터 정렬
참고
$text
이 페이지에서는 자체 관리형(Atlas에서 관리하지 않는) 배포를 위한 일반 텍스트 쿼리 기능을 제공합니다. MongoDB Atlas에서 호스팅되는 데이터의 경우 MongoDB는 향상된 전체 텍스트 쿼리 솔루션인 Atlas 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
이 각각 가장 낮고 가장 높기 때문입니다.
다음 쿼리는 사이즈가 10보다 큰 신발을 찾고 신발 사이즈를 기준으로 결과를 오름차순으로 정렬합니다.
db.shoes.find( { sizes: { $gte: 7 } } ).sort( { sizes: 1 } )
쿼리 필터가 정렬 키 선택에 영향을 주지 않기 때문에 이 쿼리는 필터에 7
보다 큰 sizes
조건이 포함되어 있더라도 _id: 'A'
가 먼저 포함된 문서를 반환합니다.
정렬 및 인덱스 사용하기
MongoDB는 정렬 필드가 포함된 인덱스에서 정렬 작업 결과를 가져올 수 있습니다. 정렬이 쿼리 조건자와 동일한 인덱스를 사용하는 경우 MongoDB는 정렬 작업을 지원하기 위해 여러 인덱스를 사용할 수 있습니다.
MongoDB가 인덱스 또는 인덱스를 사용하여 정렬을 순서대로 가져올 수 없는 경우, MongoDB는 데이터에 대해 블로킹 정렬 작업을 수행해야 합니다. 차단 정렬은 MongoDB가 정렬에 대한 모든 입력 문서를 소비하고 처리해야 함을 나타냅니다. 차단 정렬은 컬렉션이나 데이터베이스에서 동시 작업을 차단하지 않습니다.
인덱스를 사용하는 정렬 작업은 차단 정렬보다 성능이 더 좋은 경우가 많습니다. 정렬 작업을 지원하는 인덱스를 만드는 방법에 대한 자세한 내용은 인덱스를 사용하여 쿼리 결과 정렬을 참조하세요.
MongoDB에서 차단 정렬 작업에 100메가바이트 이상의 시스템 메모리를 사용해야 하는 경우 쿼리에서 cursor.allowDiskUse()
를 지정하지 않는 한 MongoDB는 오류를 반환합니다. allowDiskUse()
는 MongoDB가 차단 정렬 작업을 처리하는 동안 디스크의 임시 파일을 사용하여 100메가바이트 시스템 메모리 제한을 초과하는 데이터를 저장하도록 허용합니다.
MongoDB가 차단 정렬을 수행해야 하는지 확인하려면 쿼리에 cursor.explain()
을 추가하고 설명 결과를 확인합니다. 쿼리 계획에 SORT
단계가 포함된 경우 MongoDB는 100메가바이트 메모리 제한에 따라 차단 정렬 연산을 수행해야 합니다.
차단 정렬이 너무 많은 메모리를 소모하는 것을 방지하려면 다음을 수행합니다.
정렬 작업을 지원하는 인덱스를 생성합니다. 자세한 내용과 예시는 인덱스를 사용하여 쿼리 결과 정렬하기를 참조하세요.
cursor.limit()
과cursor.sort()
를 함께 사용하여 정렬할 데이터의 양을 제한합니다. 자세한 내용과 예시는 결과 제한하기를 참고하세요.
결과 제한
sort()
를 limit()
와 함께 사용하여 첫 번째(정렬 순서 기준) k
문서를 반환할 수 있으며, 여기서 k
는 지정된 제한입니다.
MongoDB의 인덱스 스캔을 통해 정렬 순서를 지정할 수 없는 경우, MongoDB는 상위 k개 정렬 알고리즘을 사용합니다. 이 알고리즘은 지금까지 기본 인덱스 또는 컬렉션 액세스를 통해 확인된 첫 k
결과(또는 정렬 순서에 따라 마지막 결과)를 버퍼링합니다. 해당 k
결과의 메모리 사용량이 어떤 지점에서든 100MB를 초과하면, 쿼리에서 cursor.allowDiskUse()
를 지정하지 않을 경우 이 쿼리는 실패하게 됩니다.
프로젝션과의 상호 작용
결과 집합이 정렬 및 프로젝션된 경우, MongoDB 쿼리 엔진은 항상 정렬을 먼저 적용합니다.
예시
orders
컬렉션에 포함된 문서는 다음과 같습니다.
{ _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
인덱스를 사용할 수 있습니다.