문서 메뉴

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

cursor.sort()

이 페이지의 내용

  • 정의
  • 호환성
  • 구문
  • 행동
  • 예제
  • 기본 순서로 반환
cursor.sort(sort)

중요

Mongo쉬 방법

이 페이지에서는 mongosh 메서드를 설명합니다. 이는 Node.js와 같은 언어별 드라이버에 대한 설명서가 아닙니다 .

MongoDB API 드라이버의 경우 언어별 MongoDB 드라이버 설명서를 참조하세요.

쿼리가 일치하는 문서를 반환하는 순서를 지정합니다. 데이터베이스에서 문서를 검색하기 전에 커서에 sort() 를 적용해야 합니다.

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

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

sort() 메서드에는 다음과 같은 매개 변수가 있습니다.

매개변수
유형
설명
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 필드에 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.find().sort( { "borough": 1, "_id": 1 } )

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

정렬 매개변수에 정렬 기준으로 사용할 필드를 하나 이상 지정하고 1 또는 -1 값을 지정하여 각각 오름차순 또는 내림차순 정렬을 지정합니다.

다음 작업은 먼저 age 필드를 기준으로 내림차순으로 문서를 정렬한 다음 posts 필드를 기준으로 오름차순으로 정렬합니다.

db.users.find({ }).sort( { age : -1, posts: 1 } )

정렬 작업에서 서로 다른 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" } 표현식을 사용하여 관련성 점수를 내림차순으로 정렬할 수 있습니다.

다음 샘플 문서는 "textScore" 메타데이터를 기준으로 내림차순 정렬을 지정합니다.

db.users.find(
{ $text: { $search: "operating" } },
{ score: { $meta: "textScore" }}
).sort({ score: { $meta: "textScore" } })

"textScore" 메타데이터는 내림차순으로 정렬됩니다.

자세한 내용은 $meta을(를) 참조하세요.

MongoDB는 정렬 필드가 포함된 인덱스에서 정렬 작업 결과를 가져올 수 있습니다. 정렬이 쿼리 조건자와 동일한 인덱스를 사용하는 경우 MongoDB는 정렬 작업을 지원하기 위해 여러 인덱스를 사용할 수 있습니다.

MongoDB가 인덱스 또는 인덱스를 사용하여 정렬을 순서대로 가져올 수 없는 경우, MongoDB는 데이터에 대해 블로킹 정렬 작업을 수행해야 합니다. 블로킹 정렬은 MongoDB가 정렬에 대한 모든 입력 문서를 소비하고 처리해야 함을 나타냅니다.블로킹 정렬은 컬렉션이나 데이터베이스에서 동시 작업을 차단하지 않습니다.

인덱스를 사용하는 정렬 작업은 블로킹 정렬보다 성능이 더 좋은 경우가 많습니다. 정렬 작업을 지원하는 인덱스를 만드는 방법에 대한 자세한 내용은 인덱스를 사용하여 쿼리 결과 정렬을 참조하세요.

블로킹 정렬 작업에 메가바이트 이상의 시스템 메모리를 사용해야 하는 100 경우 쿼리에 을(를) 지정 하지 cursor.allowDiskUse() 않는 한 MongoDB는 오류를 반환합니다. 는allowDiskUse() MongoDB가 블로킹 100 정렬 작업을 처리하는 동안 디스크의 임시 파일을 사용하여 메가바이트 시스템 메모리 제한을 초과하는 데이터를 저장할 수 있도록 허용합니다.

MongoDB가 블로킹 정렬을 수행해야 하는지 확인하려면 쿼리에 cursor.explain()을 추가하고 설명 결과를 확인합니다. 쿼리 계획에 SORT 단계가 포함된 경우 MongoDB는 100메가바이트 메모리 제한에 따라 블로킹 정렬 연산을 수행해야 합니다.

블로킹 정렬이 너무 많은 메모리를 소모하는 것을 방지하려면 다음을 수행합니다.

다음도 참조하세요.

sort()limit() 와 함께 사용하여 첫 번째(정렬 순서 측면에서) k 문서를 반환할 수 있으며, 여기서 k 은 지정된 제한입니다.

MongoDB가 인덱스 스캔을 통해 정렬 순서를 가져올 수 없는 경우 MongoDB는 상위 k개 정렬 알고리즘을 사용합니다. 이 알고리즘은 지금까지 k 기본 인덱스 또는 collection 액세스를 통해 확인된 첫 번째 결과(또는 정렬 순서에 따라 마지막 결과)를 버퍼링합니다. 어느 점에서든 이러한 k 결과의 100 메모리 공간이 메가바이트를 초과하면 쿼리에 를 지정하지 않는 한 쿼리가 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 인덱스를 사용할 수 있습니다.

다음도 참조하세요.

← cursor.skip()