AI 에이전트의 경우: 문서 인덱스는 https://www.mongodb.com/ko-kr/docs/llms.txt에서 사용할 수 있으며, 모든 페이지의 마크다운 버전은 어떤 URL 경로에 .md를 추가하여 사용할 수 있습니다.
Docs Menu

MongoDB 검색 결과 정렬

MongoDB Search를 사용하면 MongoDB Search 인덱스 에 정의한 필드의 결과를 오름차순 또는 내림차순으로 정렬할 수 있습니다. sort 옵션을 사용하여 다음 필드 유형별로 정렬할 수 있습니다.

  • boolean

  • date

  • number (integer, float 및 double 값)

  • objectId

  • uuid

  • string ( 토큰 유형으로 인덱싱됨)

결과에 포함된 문서의 점수와 null 값을 기준으로 정렬할 수도 있습니다.

Atlas MongoDB 7.0 이상 버전의 모든 메이저 및 마이너 릴리스에서 비샤드 및 샤딩된 정렬 쿼리를 모두 지원합니다.

  • embeddedDocuments 유형의 필드는 정렬할 수 없습니다.

  • 더 이상 사용되지 않는 knnBeta 연산자에는 sort 옵션을 사용할 수 없습니다.

MongoDB Search 결과를 정렬하려면 다음을 수행해야 합니다.

  1. 결과를 정렬할 필드에 MongoDB Search 인덱스 생성합니다.

    boolean, date, number, UUID 및 objectId 필드를 정렬하려면 동적 또는 정적 매핑을 사용합니다. 문자열 필드를 정렬하려면 정적 매핑을 사용하여 필드를 token 유형으로 인덱싱해야 합니다.

  2. Create and run your query with the sort option against the fields you defined in the index for sorting. To learn more, see Syntax.

The sort option takes a document that specifies the fields to sort by and the respective sort order. MongoDB Search follows the MongoDB comparison order for the supported data types. It treats UUID values like BinData. To learn more, see non-existent fields.

다음 정렬 순서를 지정하여 결과를 정렬할 수 있습니다.

1

오름차순으로 정렬합니다.

오름차순으로 정렬하면 MongoDB Search는 값이 있는 문서보다 누락된 값이 있는 문서를 반환합니다.

-1

내림차순으로 정렬합니다.

You can also sort by score in ascending or descending order. The sort option takes a document that specifies the $meta expression, which requires the searchScore value.

예시

애플리케이션에서 사용자가 검색 결과의 마지막 페이지로 건너뛸 수 있도록 허용한다고 가정해 보겠습니다. 다음 예시에서는 점수가 가장 낮은 문서가 결과 상단에 표시되도록 점수를 기준으로 결과를 오름차순으로 정렬합니다.

sort: {score: {$meta: "searchScore", order: 1}}

결과의 여러 문서에 동일한 점수가 있는 경우 sort 를 사용하여 결과의 순서가 결정되도록 할 수도 있습니다. 예시 를 들어, 다음 예시 와 같이 lastUpdated 이라는 이름의 날짜 필드 와 같이 고유한 필드 기준으로 결과를 정렬하면 MongoDB Search는 동일한 점수를 가진 결과를 정해진 순서에 따라 반환합니다.

예시

sort: {score: {$meta: "searchScore"}, lastUpdated: 1}

그러나 결과를 정렬할 고유 필드 지정하지 않으면 MongoDB Search는 점수를 기준으로 정렬된 결과를 내림차순으로 반환합니다. MongoDB Search는 동일한 점수 또는 값을 가진 결과를 임의의 순서로 반환합니다. 다음 예시 고유한 필드 기준으로 결과를 정렬하지 않습니다.

예시

sort: {score: {$meta: "searchScore"}}

자세히 알아보려면 결과에서 문서 점수 매기기를 참조하세요.

MongoDB Search는 정렬을 위해 배열을 평면화합니다.

예시

다음 배열을 살펴보세요.

[4, [1, [8,5], 9], 2]

MongoDB Search는 다음과 유사하게 이전 배열 평면화합니다.

4, 1, 8, 5, 9, 2

오름차순 정렬의 경우 MongoDB Search는 1 를 사용하여 배열 다른 값과 비교합니다. 내림차순 정렬의 경우 MongoDB Search는 9 를 사용하여 배열 다른 값과 비교합니다.

배열 내부의 요소와 비교할 때:

  • 오름차순 정렬의 경우 MongoDB Search는 배열 의 가장 작은 요소를 비교하거나 보다 작은(<) 비교를 수행합니다.

    예시

    MongoDB Search는 숫자를 기준으로 오름차순으로 정렬하는 경우 다음과 같은 순서로 결과를 정렬합니다.

    -20
    [-3, 12] // <- -3 comes before 5.
    5
    [6, 18] // <- 6 comes after 5.
    13
    14
  • 내림차순 정렬의 경우 MongoDB Search는 배열 의 가장 큰 요소를 비교하거나 보다 큰 값(>) 비교를 수행합니다.

    예시

    MongoDB Search는 숫자를 기준으로 내림차순으로 정렬하는 경우 다음과 같은 순서로 결과를 정렬합니다.

    [6, 18] // <- 18 comes before 14.
    14
    13
    [-3, 12] // <- 12 comes after 13.
    5
    -20

When sorting over array fields that contain values of multiple BSON types, MongoDB Search selects a representative element from the array to use for comparison according to the MongoDB comparison and sort order by default.

  • 오름차순 정렬의 경우 MongoDB Search는 BSON 유형이 가장 낮은 요소를 사용합니다.

  • 내림차순 정렬의 경우 MongoDB Search는 BSON 유형이 가장 높은 요소를 사용합니다.

배열 에 동일한 BSON 유형의 값이 여러 개 있는 경우 선택한 유형에 대한 표준 정렬 동작이 적용됩니다.

예시

다음 배열을 살펴보세요.

[ 'foo', null, 15, true, false ]
  • 오름차순 정렬의 경우, MongoDB Search는 null 지원되는 가장 낮은 BSON types인 을(를) 사용합니다.

  • 내림차순 정렬의 경우 MongoDB Search는 true을 사용합니다. 배열에서 가장 높은 BSON 타입이기 때문이며 MongoDB Search는 true 값을 false 값보다 위에 순위를 매갑니다.

그러나 sort 구문에 noData: highest 를 설정하다 MongoDB Search는 null 및 누락된 값을 가장 높은 BSON 유형으로 간주합니다. 예시 배열 의 경우 다음 동작이 적용됩니다.

  • 오름차순 정렬의 경우 MongoDB Search는 이제 배열에서 가장 낮은 BSON types 15 을 사용합니다.

  • 내림차순 정렬의 경우 MongoDB Search는 null이(가) 배열에서 가장 높은 BSON types이므로 사용합니다.

To learn more, see 자세히 학습 Null 및 누락된 값으로 정렬을 참조하세요.

For an example, see Sort on Multi-Typed Arrays.

MongoDB Search는 null 값을 누락되거나 빈 값과 동일하게 취급하며, 이러한 값이 있는 문서의 순서는 정렬 시 비결정적입니다.

By default, MongoDB Search follows the MongoDB comparison and sort order and considers null values as lower than all other supported BSON types. Therefore, null values appear at the top of the results during an ascending sort and at the bottom during a descending sort.

To configure where null values appear in the results, specify the noData field in your sort syntax. The noData field takes the following values:

  • lowest (기본값): 정렬 중에 null 값을 가장 낮은 BSON type으로 설정합니다. 오름차순 정렬 시 결과의 맨 위에 null 값을 정렬하고 내림차순 정렬 시 맨 아래에 정렬합니다.

  • highest: 정렬 중에 null 값을 가장 높은 BSON type으로 설정합니다. 오름차순 정렬 시 결과의 맨 아래에, 내림차순 정렬 시 맨 위에 null 값을 정렬합니다.

참고

null 또는 누락된 값이 포함된 여러 유형의 배열을 정렬할 때도 동일한 동작이 적용됩니다.

예제는 Null 값으로 정렬 및 다중 유형 배열에서 정렬을 참조하세요.

내장된 문서 필드를 기준으로 상위 문서를 정렬하려면 다음을 수행해야 합니다.

  • 내장된 문서 하위 필드의 상위 항목을 문서 유형으로 인덱싱합니다.

  • 내장된 문서 내에서 문자열 값을 사용하여 하위 필드를 토큰 유형으로 인덱싱합니다. 숫자 및 날짜 값이 있는 하위 필드의 경우 동적 매핑을 활성화하여 해당 필드를 자동으로 인덱싱합니다.

MongoDB Search는 상위 문서에서만 정렬합니다. 문서 배열 내의 하위 필드는 정렬하지 않습니다. 예시는 정렬 예제를 참조하세요.

MongoDB Search 인덱스는 최종적으로 일관적인 되며 결과에 반환되는 값은 정렬에 사용된 값과 다를 수 있습니다.

This feature optimizes queries that use $search with $limit as a subsequent stage. If MongoDB Search needs to sort all documents in the collection, the response might be slow.

MongoDB Search는 결과의 모든 문서에 대한 점수 를 반환합니다. 그러나 점수별로 명시적으로 정렬하지 않는 한 결과의 문서 순서가 정렬 기준을 기반으로 하기 때문에 점수가 낮은 문서 다음에 점수가 높은 문서가 표시될 수 있습니다.

sort 의 구문은 다음과 같습니다:

1{
2 "$search": {
3 "index": "<index name>", // optional, defaults to "default"
4 "<operator>": { // such as "text", "compound", or "phrase"
5 <operator-specification>
6 },
7 "sort": {
8 score: {$meta: "searchScore"}, // optional field
9 "<field-to-sort>": <sort-order>, // 1 or -1, or a document
10 ...
11 }
12 }
13}
Parameter
설명

score

Optional. Determines whether to sort by the search score. To learn more, see Sort by Score And a Unique Field.

<field-to-sort>

필수입니다. 정렬 기준이 되는 필드 의 이름입니다.

<sort-order>

필수입니다. 정렬 순서를 결정합니다. 오름차순에는 1 을 사용하고 내림차순에는 -1 을 사용합니다.

If you want to specify the noData field, use a document with the following syntax:

"<field-to-sort>": {
order: 1 | -1, // required field
noData: "lowest" | "highest" // optional field
},
...

다음 예시에서는 sample_mflix.movies, sample_airbnb.listingsAndReview 또는 users라는 사용자 지정 컬렉션을 사용합니다.

이 페이지의 예시 쿼리는 sample_mflix.movies, sample_airbnb.listingsAndReview 또는 사용자 지정 컬렉션을 사용합니다. 이러한 컬렉션에 다음과 같은 인덱스를 만들면 인덱싱된 필드에 대해 샘플 쿼리를 실행할 수 있습니다.

다음 쿼리는 복합 연산자 쿼리를 실행하고 날짜 필드를 기준으로 결과를 정렬하는 방법을 보여 줍니다. 다음 연산자를 사용합니다.

  • 와일드카드 연산자를 사용하여 Summer로 시작하는 영화 제목을 검색합니다.

  • 근사(near) 연산자를 입력해 2014년 4월 18일 전후로 약 5개월 안에 개봉한 영화를 검색할 수 있습니다.

    참고

    날짜 필드 에 pivot 를 사용하는 경우 해당 측정 단위는 밀리초입니다. MongoDB Search는 날짜 필드 지정된 날짜와 얼마나 가까운지에 따라 각 문서 의 점수를 계산합니다. 자세한학습 은 near를 참조하세요.

쿼리는 다음 파이프라인 단계를 사용합니다:

  • $search 단계를 사용하여 title과 released 필드를 검색한 다음 결과를 released 필드를 기준으로 내림차순으로 정렬합니다.

  • $limit stage to limit the output to 5 results.

  • $project 단계로 이동합니다:

    • title와 released 이외의 모든 필드를 제외합니다.

    • score(이)라는 필드를 추가합니다.

다음 쿼리는 숫자 필드를 기준으로 결과를 정렬하는 방법을 보여 줍니다. 범위 연산자를 사용하여 10개 이상의 상을 수상한 영화를 검색한 다음 숫자 필드 값을 기준으로 결과를 내림차순으로 정렬합니다.

쿼리는 다음 파이프라인 단계를 사용합니다:

  • $search 단계를 사용하여 awards.wins 필드를 검색하고 결과를 내림차순으로 정렬합니다.

  • $limit stage to limit the output to 5 results.

  • $project stage to exclude all fields except title and awards.wins.

sample_mflix.movies 네임스페이스에 대한 다음 쿼리는 $search 단계를 사용하여 다음을 수행합니다.

  • 제목에 country(이)라는 용어가 포함된 영화를 검색합니다.

  • sort 옵션을 사용하여 결과를 오름차순으로 정렬합니다.

The query uses the $limit stage to limit the output to 5 documents. It also uses the $project stage to do the following:

  • 결과에서 title을 제외한 모든 필드를 생략합니다.

  • score(이)라는 필드를 추가합니다.

db.movies.aggregate([
{
"$search": {
"text": {
"path": "title",
"query": "country"
},
"sort": {
"title": 1
}
}
},
{
"$limit": 5
},
{
"$project": {
"_id": 0,
"title": 1,
"score": { "$meta": "searchScore" }
}
}
])

다음 쿼리는 문자열 필드를 기준으로 결과를 쿼리하고 정렬하는 방법을 보여 줍니다. Prance 또는 Prince로 시작하는 제목을 검색하고 title 필드를 기준으로 오름차순으로 결과를 정렬합니다.

쿼리는 다음 파이프라인 단계를 사용합니다:

  • 와일드카드 연산자와 함께 should절을 사용해 title 필드를 검색하여 Prance 및 Prince로 시작하는 제목을 검색하려면 $search를 입력합니다. 이 쿼리는 또한 결과가 title 필드를 기준으로 오름차순으로 정렬되도록 지정합니다.

  • $limit stage to limit the output to 5 results.

  • $project 단계로 이동합니다:

    • title을 제외한 모든 필드를 제외합니다.

    • score(이)라는 필드를 추가합니다.

다음 쿼리는 대소문자에 관계없이 결과를 정렬하는 방법을 보여줍니다. 텍스트 연산자를 사용하여 title 필드에 train이라는 용어가 있는 영화를 검색한 다음 결과를 title 필드 값을 기준으로 오름차순으로 정렬합니다.

The query specifies a $limit stage to limit the documents in the results to 5 and a $project stage to do the following:

  • 결과에 _id, title 및 awards 필드만 포함합니다.

  • 결과에 score라는 필드를 추가합니다.

다음 쿼리는 range 연산자를 사용하여 sample_mflix.movies 컬렉션의 released 필드에서 2015-01-01에서 2015-12-31 사이에 개봉된 영화를 검색합니다. ObjectId 유형의 값을 포함하는 _id 필드를 기준으로 결과를 내림차순으로 정렬합니다.

db.movies.aggregate([
{
"$search": {
"range": {
"path": "released",
"gt": ISODate("2015-01-01T00:00:00.000Z"),
"lt": ISODate("2015-12-31T00:00:00.000Z")
},
"sort": {
"_id": -1
}
}
},
{
"$limit": 5
},
{
"$project": {
"_id": 1,
"title": 1,
"released": 1,
"score": { "$meta": "searchScore" }
}
}
])

다음 쿼리는 users 컬렉션의 b 필드에서 hello 텀을 검색합니다. 쿼리는 정렬 순서를 나타내기 위해 다형성 데이터를 포함하는 필드 a 기준으로 결과를 오름차순으로 정렬합니다.

db.users.aggregate([
{
"$search": {
"text": {
"path": "b",
"query": "hello"
},
"sort": {
"a": 1
}
}
},
{
"$project": {
"_id": 1,
"a": 1,
"score": { "$meta": "searchScore" }
}
}
])

텍스트 연산자 사용하여 컬렉션 에서 문자열 에 대해 필드 을(를) 검색 다음 b hello users 쿼리를 고려합니다. 그런 다음 쿼리 컬렉션 의 일부 문서에 대해 null 또는 누락된 값을 포함하는 c 필드 기준으로 결과를 정렬합니다.

To learn more, see 자세히 학습 Null 및 누락된 값으로 정렬을 참조하세요.

참고

noData: lowest 설정은 기본값 과 동일합니다.

"_id": 4, "_id": 5, "_id": 6 가 있는 문서의 순서는 임의적이며, 이는 MongoDB Search가 정렬 시 null 값과 누락된 값을 동일하게 취급하기 때문입니다.

Consider the following queries on the users collection given an additional document with a multi-typed array in field c:

db.users.insertOne({
"_id": 7,
"a": UUID("03e32aa9-1cbd-43b8-b9d6-18b171a03cc7"),
"b": "hello",
"c": [ false, null, 15 ]
})

다음은 b 텍스트 연산자 hello 사용하여 문자열 에 대해 필드 을 검색 하고 결과를 필드 c 을 기준으로 정렬합니다.

참고

정렬 noData: lowest 구문에서 를 설정하는 것은 기본값 과 동일합니다.

다음 쿼리는 를 noData: highest 지정하여 정렬 중에 null 값을 가장 높은 BSON types로 설정하다 .

다음 쿼리는 sample_airbnb.listingsAndReviews 컬렉션에서 Portugal 지역의 속성을 검색하고 결과를 is_location_exact라는 boolean 필드를 기준으로 내림차순으로 정렬합니다.

The query uses the $limit stage to limit the output to 5 documents. It also uses the $project stage to omit all fields except name, property_type, address.country, and address.location.is_location_exact in the results.

1db.listingsAndReviews.aggregate([
2 {
3 "$search": {
4 "text": {
5 "path": "address.country",
6 "query": "Portugal"
7 },
8 "sort": {
9 "address.location.is_location_exact": -1,
10 }
11 }
12 },
13 {
14 "$limit": 5
15 },
16 {
17 "$project": {
18 "_id": 0,
19 "name": 1,
20 "property_type": 1,
21 "address.country": 1,
22 "address.location.is_location_exact": 1
23 }
24 }
25])

앞의 결과에서 MongoDB Search는 내림차순 정렬에서 true 값의 순위를 false 값보다 높게 지정하기 때문에 문서의 is_location_exact 값이 true 입니다. 이전 쿼리 의 9 줄에 있는 값을 1로 변경하여 오름차순 정렬을 수행하면 MongoDB Search는 false 값이 true 값보다 높은 문서의 순위를 지정하고 다음 문서를 반환합니다.

[
{
name: 'Ribeira Charming Duplex',
property_type: 'House',
address: { country: 'Portugal', location: { is_location_exact: false } }
},
{
name: 'Be Happy in Porto',
property_type: 'Loft',
address: { country: 'Portugal', location: { is_location_exact: false } }
},
{
name: 'Downtown Oporto Inn (room cleaning)',
property_type: 'Hostel',
address: { country: 'Portugal', location: { is_location_exact: false } }
},
{
name: 'A Casa Alegre é um apartamento T1.',
property_type: 'Apartment',
address: { country: 'Portugal', location: { is_location_exact: false } }
},
{
name: 'FloresRooms 3T',
property_type: 'Apartment',
address: { country: 'Portugal', location: { is_location_exact: false } }
}
]

다음 쿼리는 $search 단계를 사용하여 다음을 수행합니다.

  • 제목에 dance라는 단어가 포함된 영화를 검색하며, 상을 2개 이상 수상하고 1990년 1월 1일 이후에 개봉한 영화가 우선적으로 검색됩니다.

  • 수상 횟수를 기준으로 결과를 내림차순으로 정렬한 다음, 영화 제목별로 오름차순으로 정렬하고 개봉일을 기준으로 내림차순으로 정렬합니다.

The query uses the $limit stage to limit the output to 10 documents. It also uses the $project stage to do the following:

  • 결과에서 title, released, awards.wins를 제외한 모든 필드를 생략합니다.

  • score(이)라는 필드를 추가합니다.

db.movies.aggregate([
{
"$search": {
"compound": {
"must": [{
"text": {
"path": "title",
"query": "dance"
}
}],
"should": [{
"range": {
"path": "awards.wins",
"gte": 2
}
}, {
"range": {
"path": "released",
"gte": ISODate("1990-01-01T00:00:00.000Z")
}
}]
},
"sort": {
"awards.wins": -1,
"title": 1,
"released": -1
}
}
},
{
"$limit": 10
},
{
"$project": {
"_id": 0,
"title": 1,
"released": 1,
"awards.wins": 1,
"score": { "$meta": "searchScore" }
}
}
])

다음 쿼리는 $search 단계를 사용하여 다음을 수행합니다.

  • 범위 연산자를 사용하여 2010년 1월 1일에서 2015년 1월 1일 사이에 개봉한 영화를 검색합니다.

  • 1, 5 10, 15 상을 받은 영화의 수를 구합니다.

  • 2010-01-01, 2011-01-01, 2012-01-01, 2013-01-01, 2014-01-01, 2015-01-01에 개봉한 영화의 수를 구합니다.

  • sort 옵션을 사용하여 출시 날짜의 내림차순으로 결과를 정렬합니다.

The query uses the $limit stage to do the following:

  • docs 출력 필드에 있는 5개 문서로 출력을 제한합니다.

  • meta 출력 필드에 있는 1개 문서로 출력을 제한합니다.

It uses the $project stage to omit all fields except the awards.wins, released, and title fields.

It also uses the $replaceWith stage to include the metadata results stored in the $$SEARCH_META variable in the meta output field and the $set stage to add the meta field to the results.

db.movies.aggregate([
{
"$search": {
"facet": {
"operator": {
"range": {
"path": "released",
"gt": ISODate("2010-01-01T00:00:00.000Z"),
"lt": ISODate("2015-01-01T00:00:00.000Z")
}
},
"facets": {
"awardsFacet": {
"type": "number",
"path": "awards.wins",
"boundaries" : [1,5,10,15]
},
"releasedFacet" : {
"type" : "date",
"path" : "released",
"boundaries" : [ISODate("2010-01-01T00:00:00.000Z"), ISODate("2011-01-01T00:00:00.000Z"), ISODate("2012-01-01T00:00:00.000Z"), ISODate("2013-01-01T00:00:00.000Z"), ISODate("2014-01-01T00:00:00.000Z"), ISODate("2015-01-01T00:00:00.000Z")]
}
}
},
"sort": {
"released": -1
}
}
},
{
"$facet": {
"docs": [
{ "$limit": 5 },
{ "$project":
{
"_id": 0,
"title": 1,
"released": 1,
"awards.wins": 1
}
}
],
"meta": [
{"$replaceWith": "$$SEARCH_META"},
{"$limit": 1}
]
}
},
{
"$set": {
"meta": {
"$arrayElemAt": ["$meta", 0]
}
}
}
])

다음 예에서는 결과에서 문서 점수를 기준으로 결과를 정렬하는 방법을 보여줍니다. 예시에서는 다음 조치를 수행하는 방법을 보여 줍니다.

  • 결과를 오름차순으로 정렬하여 점수가 가장 낮은 문서를 먼저 조회합니다.

  • 결과를 점수별로 내림차순으로 정렬하고, 점수가 동일한 결과에 대해서는 임의로 정렬합니다.

  • 결과를 점수별로 정렬하고, 점수가 동일한 결과의 경우 고유한 필드를 사용하여 정렬합니다.