MongoDB Search를 사용하면 인덱스에서 정렬을 구성하여 쿼리 시간에 정렬하는 대신 인덱스 시간에 문서를 오름차순 또는 내림차순으로 미리 정렬할 수 있습니다. 결과 세트가 매우 큰 경우 쿼리 시간 정렬이 느려지므로 이는 유용합니다. 다음 MongoDB Search 필드 유형에 sort 인덱스 옵션을 사용할 수 있습니다.
booleandatenumber(integer, float 및 double 값)objectIdtokenuuid
noData 옵션을 사용하여 null 또는 누락된 값을 정렬하는 방식도 구성할 수 있습니다.
구문
sort 옵션의 구문은 다음과 같습니다.
1 { 2 "mappings": { 3 "dynamic": true|false, 4 "fields": { 5 "<field-name>": { 6 "type": "boolean" | "date" | "number" | "objectId" | "token" | "uuid" 7 } 8 } 9 }, 10 "sort": { "<field-to-sort>": 1 | -1 } | { "<field-to-sort>": { "order": 1 | -1, "noData": "lowest" | "highest" } } 11 }
요구 사항:
정렬된 인덱스를 사용하려면 다음을 수행해야 합니다.
정적 매핑을 사용하여
sort에 사용되는 필드를 구성합니다.booleandatenumber(integer, float 및 double 값)objectIdtoken(stringvalues)uuid
MongoDB Search는 인덱싱하는 필드를
sort에 대한 다중 유형으로 지원합니다. 이 때 유형 중 적어도 하나가 위에 나열된 지원 유형 중 하나여야 합니다.중청 필드를 기준으로 정렬하려면 루트 필드까지의 모든 중간 필드를
document유형으로 구성합니다.
참고
동적 매핑 또는 typeSet을 사용하여 인덱스된 필드와 함께 sort 옵션을 지정하면 인덱스 빌드가 실패합니다.
행동
정렬된 인덱스는 쿼리 시간에 정렬하는 대신 구성된 최상위 정렬을 사용하여 인덱스 생성 시 MongoDB Search 문서를 물리적으로 정렬합니다. 이는 쿼리의 $search.sort 사양이 인덱스 정렬 또는 인덱스 정렬의 접두사와 일치하는 쿼리의 성능을 향상시킵니다. 특히 매우 큰 결과 세트(결과에 100만 개 이상의 문서 등)에 대해 정렬할 때 유용합니다.
explain 출력을 사용하여 쿼리가 인덱스 정렬을 사용하는지 확인합니다. 인덱스 정렬의 이점을 받는 쿼리에는 필드 usesIndexSort: true가 포함됩니다. 쿼리의 정렬 필드가 인덱스 정렬 또는 인덱스 정렬의 접두사와 일치할 때 쿼리가 이점을 받습니다.
참고
점수는 쿼리 시에만 계산되므로 정렬된 인덱스의 일부로 searchScore 메타 표현식을 사용할 수 없습니다.
배열 지원
배열 필드를 정렬할 수 있습니다. MongoDB Search는 배열을 평면화하고 하나의 대표 값을 사용하여 비교합니다. 오름차순 정렬의 경우 배열의 가장 낮은 값을 사용하고, 내림차순 정렬의 경우 배열의 가장 높은 값을 사용합니다.
혼합 유형 배열의 정렬 순서는 MongoDB BSON 비교 순서에 기반합니다. 오름차순 정렬의 경우 MongoDB Search는 가장 낮은 BSON 유형의 요소를 사용합니다. 내림차순 정렬의 경우 MongoDB Search는 가장 높은 BSON 유형의 요소를 사용합니다.
내장된 문서 지원
모든 상위 문서가 document 유형으로 정적으로 정의된 경우에만 하위 필드를 기준으로 정렬할 수 있습니다.
returnScope 를 사용하는 쿼리는 정렬된 인덱스의 이점을 받지 못합니다. 정렬된 인덱스 정의는 정렬을 위한 인덱스에서 embeddedDocuments 필드 유형을 지원하지 않기 때문입니다.
고려 사항
sort사양을 가진 인덱스에서는 인덱스 생성 및 복제가 느려질 수 있습니다.인덱스 정렬의 반대로
$search.sort이(가) 지정된 쿼리는 정렬되지 않은 인덱스를 사용하는 것보다 느릴 수 있습니다. 다른$search.sort사양을 사용하는 쿼리는 영향을 받지 않습니다.MongoDB Search는 인덱스당
sort사양만 지원합니다. 다른 필드를 기준으로 정렬하려면 지배적인 정렬 순서를 인덱스 정렬으로 선택하세요.
예시
다음 예시에서는 sample_airbnb.listingsAndReviews 컬렉션의 필드에 정렬된 인덱스를 생성합니다.
다음 인덱스 정의는 number_of_reviews 필드와 last_reviewed 필드를 내림차순으로 정렬합니다.
{ "mappings": { "dynamic": false, "fields": { "number_of_reviews": { "type": "number" }, "last_reviewed": { "type": "date" } } }, "sort": { "number_of_reviews": -1, "last_reviewed": -1 } }
다음 인덱스 정의는 number_of_reviews 필드와 last_reviewed 필드를 내림차순으로 정렬합니다. 결과의 하단에 null 또는 누락된 값이 있는 문서를 넣습니다.
{ "mappings": { "dynamic": false, "fields": { "number_of_reviews": { "type": "number" }, "last_reviewed": { "type": "date" } } }, "sort": { "number_of_reviews": { "order": -1, "noData": "lowest" }, "last_reviewed": { "order": -1, "noData": "lowest" } } }
다음 인덱스 정의는 date 필드를 내림차순으로 정렬합니다. date 필드를 기준으로 정렬하려면 reviews 필드를 embeddedDocuments 유형과 document 유형으로 정의합니다.
{ "mappings": { "dynamic": false, "fields": { "reviews": [ { "type": "embeddedDocuments", "dynamic": true }, { "type": "document", "dynamic": false, "fields": { "date": { "type": "date" } } } ] } }, "sort": { "reviews.date": -1 } }
다음 인덱스 정의는 결과 하단에 날 및 누락 값이 표시되는 오름차순으로 property_type 필드를 정렬합니다. property_type 필드는 string, autocomplete 및 token 유형으로 정의됩니다. 인덱스는 정렬에 token 유형만 사용합니다.
{ "mappings": { "dynamic": false, "fields": { "property_type": [ { "type": "string" }, { "type": "autocomplete", "tokenization": "edgeGram", "minGrams": 2, "maxGrams": 15 }, { "type": "token" } ] } }, "sort": { "property_type": { "order": 1, "noData": "highest" } } }