Docs Menu
Docs Home
/
Atlas
/ / / /

Atlas Search 결과 정렬

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

  • boolean

  • date

  • number (integer, float 및 double 값)

  • objectId

  • uuid

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

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

Atlas는 모든 메이저 및 마이너 MongoDB 5.0 이상 버전에서 샤딩되지 않은 정렬 쿼리를 지원합니다. 샤딩된 정렬 쿼리는 6.0 버전의 모든 주요 릴리스와 7.0 이상 버전의 모든 메이저 및 마이너 릴리스에서 사용할 수 있습니다.

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

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

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

  1. 결과 정렬 시 기준이 되는 필드에 Atlas Search 인덱스를 생성합니다.

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

  2. 정렬을 위해 인덱스에 정의한 필드에 대해 sort 옵션을 사용하여 쿼리를 만들고 실행합니다. 자세한 내용은 구문을 참조하세요.

sort 옵션은 정렬 기준이 되는 필드와 해당 정렬 순서를 지정하는 문서를 사용합니다. Atlas Search는 지원되는 데이터 유형에 대해 MongoDB 비교 순서 를 따릅니다. UUID 값을 BinData와 동일하게 취급합니다. 자세한 내용은 존재하지 않는 필드를 참조하세요.

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

1

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

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

-1

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

점수를 기준으로 오름차순 또는 내림차순으로 정렬할 수도 있습니다. sort 옵션은 searchScore 값이 필요한 $meta 표현식을 지정하는 문서를 사용합니다.

예시

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

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

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

예시

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

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

예시

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

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

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

예시

다음 배열을 살펴보세요.

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

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

4, 1, 8, 5, 9, 2

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

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

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

    예시

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

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

    예시

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

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

여러 BSON 유형의 값이 포함된 배열 필드를 정렬할 때 Atlas Search 기본값 으로 MongoDB 비교 및 정렬 순서에 따라 배열 에 사용할 대표 요소를 선택합니다.

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

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

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

예시

다음 배열을 살펴보세요.

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

  • 내림차순 정렬의 경우 Atlas Search 배열 true 에서 가장 높은 BSON types인 을 사용하고 Atlas Search true 값을 값보다 위에 false 순위를 매깁니다.

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

  • 오름차순 정렬의 경우, Atlas Search 을 사용하는데,15 이는 이제 배열 에서 가장 낮은 BSON types이기 때문입니다.

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

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

예시 는 다중 유형 배열에서 정렬을 참조하세요.

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

기본값 으로 Atlas Search MongoDB 비교 및 정렬 순서를 따르며 null 값을 지원되는 다른 모든 BSON types보다 낮은 것으로 간주합니다. 따라서 null 값은 오름차순 정렬 시 결과 상단에 표시되고 내림차순 정렬 시 결과 하단에 표시됩니다.

결과에서 null 값이 표시되는 noData 위치를 구성하려면 sort 구문에 필드 지정합니다. noData 필드 다음 값을 사용합니다.

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

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

참고

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

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

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

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

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

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

Atlas Search 인덱스는 결국 일관적이며, 결과에 반환되는 값은 정렬에 사용된 값과 다를 수 있습니다.

이 기능은 $search$limit를 후속 단계로 사용하는 쿼리를 최적화합니다. Atlas Search가 컬렉션의 모든 문서를 정렬해야 하는 경우 응답이 느릴 수 있습니다.

Atlas 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

선택 사항. 검색 점수를 기준으로 정렬할지 여부를 결정합니다. 자세한 학습 점수 및 고유 필드별 정렬을 참조하세요.

<field-to-sort>

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

<sort-order>

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

noData 필드 지정하려면 다음 구문의 문서 사용하세요.

"<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 또는 사용자 지정 컬렉션을 사용합니다. 이러한 컬렉션에 다음과 같은 인덱스를 만들면 인덱싱된 필드에 대해 샘플 쿼리를 실행할 수 있습니다.

movies 컬렉션에 대한 인덱스 정의는 다음을 지정합니다.

  • awards.wins 필드를 다음과 같이 인덱싱합니다.

    • number 패싯 쿼리 실행을 포함한 정렬 및 쿼리 유형

  • released 필드를 다음과 같이 인덱싱합니다.

  • title 필드를 다음과 같이 인덱싱합니다.

    • token 정렬용 유형

    • string 쿼리 유형

1{
2 "mappings": {
3 "dynamic": true,
4 "fields": {
5 "awards": {
6 "dynamic": false,
7 "fields": {
8 "wins": [
9 {
10 "type": "number"
11 }
12 ]
13 },
14 "type": "document"
15 },
16 "released": [
17 {
18 "type": "date"
19 }
20 ],
21 "title": [{
22 "type": "token"
23 }, {
24 "type": "string"
25 }]
26 }
27 }
28}

앞의 인덱스 정의에 경우, Atlas Search는 지정된 필드에 정적 매핑을 사용하여 default라는 이름의 인덱스를 만듭니다.

sample_airbnb.listingsAndReviews 컬렉션에 대한 예시 쿼리는 다음 인덱스를 사용합니다. 인덱스 정의는 컬렉션의 필드에 대한 동적 매핑을 지정합니다.

{
"mappings": {
"dynamic": true
}
}

users 컬렉션에는 다음 문서가 포함되어 있습니다.

db.users.insertMany([
{
"_id": 0,
"a": UUID("1a324de2-e34b-c87e-f2a1-42ce37ad74ed"),
"b": "hello",
"c": ObjectId("507f1f77bcf86cd799439011")
},
{
"_id": 1,
"a": UUID("3b241101-e2bb-4255-8caf-4136c566a962"),
"b": "hello",
"c": true
},
{
"_id": 2,
"a": UUID("dee11d4e-63c6-4d90-983c-5c9f1e79e96c"),
"b": "hello",
"c": "foo"
},
{
"_id": 3,
"b": "hello",
"c": UUID("3be11d4e-62cb-4e95-9a3c-5c9f1e56c732")
},
{
"_id": 4,
"a": UUID("d3c12e1c-c36e-25ed-7c3e-1e7f1e53c752"),
"b": "hello",
"c": null
},
{
"_id": 5,
"a": UUID("d73f181e-cdda-42b4-b844-4d6e172e9bc8"),
"b": "hello",
"c": []
}
{
"_id": 6,
"a": UUID("7eeddf21-b313-4a5c-81c2-c68915daa618"),
"b": "hello",
}
])

users 컬렉션에 대한 인덱스 정의는 다음을 지정합니다.

  • c라는 필드를 제외한 모든 필드를 동적으로 인덱스 합니다.

  • 정렬을 위해 c라는 이름의 정적인 인덱스 필드를 다음 유형으로 지정합니다.

    • token

    • uuid

    • objectId

    • boolean

1{
2 "mappings": {
3 "dynamic": true,
4 "fields": {
5 "c": [
6 { "type": "token" },
7 { "type": "uuid" },
8 { "type": "objectId" },
9 { "type": "boolean" },
10 { "type": "number" }
11 ]
12 }
13 }
14}

이전 컬렉션의 경우 Atlas Search는 지정된 필드에 지정된 매핑을 사용하여 default라는 이름의 인덱스를 생성합니다.

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

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

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

    참고

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

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

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

  • $limit 단계는 출력을 5 결과로만 제한합니다.

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

    • titlereleased 이외의 모든 필드를 제외합니다.

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

1

다음 쿼리를 복사하여 Query Editor에 붙여 넣은 다음 Query Editor에서 Search 버튼을 클릭합니다.

[
{
$search: {
"compound": {
"filter": [{
"wildcard": {
"query": "Summer*",
"path": "title"
}
}],
"must": [{
"near": {
"pivot": 13149000000,
"path": "released",
"origin": ISODate("2014-04-18T00:00:00.000+00:00")
}
}]
},
"sort": {
"released": -1,
"title": 1
}
}
}
]
SCORE: 0.348105788230896 _id: "573a13f0f29313caabddaf7a"
countries: Array
runtime: 104
cast: Array
...
title: "Summer Nights"
...
released: 2015-01-28T00:00:00.000+00:00
...
SCORE: 0.5917375683784485 _id: "573a13e6f29313caabdc673b"
plot: "25-year-old Iiris and Karoliina have been best friends since childhood…"
genres: Array
runtime: 90
...
title: "Summertime"
...
released: 2014-08-01T00:00:00.000+00:00
...
SCORE: 0.9934720396995544 _id: "573a13eff29313caabdd760c"
plot: "Erik Sparrow is one of the lucky ones. He's got a good job. He's in a …"
genres: Array
runtime: 86
...
title: "Summer of Blood"
...
released: 2014-04-17T00:00:00.000+00:00
...
SCORE: 0.15982933342456818 _id: "573a13cff29313caabd8ab74"
plot: "The story of an adult and a teenage couple during a brief summer holid…"
genres: Array
countries: Array
...
title: "Summer Games"
...
released: 2012-02-08T00:00:00.000+00:00
...
SCORE: 0.13038821518421173 _id: "573a13cef29313caabd87f4e"
plot: "Summer of Goliath is a documentary/fiction hybrid that narrates variou…"
genres: Array
runtime: 78
...
title: "Summer of Goliath"
...
released: 2011-07-08T00:00:00.000+00:00
...
SCORE: 0.08124520629644394 _id: "573a13c7f29313caabd7608d"
plot: "A student tries to fix a problem he accidentally caused in OZ, a digit…"
genres: Array
runtime: 114
...
title: "Summer Wars"
...
released: 2009-08-01T00:00:00.000+00:00
SCORE: 0.0711759403347969 _id: "573a13bbf29313caabd54ee6"
plot: "The life of a public school epitomized by disobedient student Jonah Ta…"
genres: Array
runtime: 30
...
title: "Summer Heights High"
...
released: 2008-11-09T00:00:00.000+00:00
...
SCORE: 0.06951779872179031 _id: "573a13bff29313caabd5f935"
plot: "On his spring break at the seaside, with his wife and his four year ol…"
genres: Array
runtime: 102
...
title: "Summer Holiday"
...
released: 2008-09-19T00:00:00.000+00:00
...
SCORE: 0.05834990739822388 _id: "573a13c0f29313caabd628ac"
plot: "Kochi Uehara is a fourth grade student living in the suburb of Tokyo. …"
genres: Array
runtime: 138
...
title: "Summer Days with Coo"
...
released: 2007-07-28T00:00:00.000+00:00
...
SCORE: 0.056174591183662415 _id: "573a13b8f29313caabd4c1d0"
fullplot: "Country girl Yu Hong leaves her village, her family and her lover to s…"
genres: Array
runtime: 158
...
title: "Summer Palace"
...
released: 2007-04-18T00:00:00.000+00:00
...
2

Search Tester는 반환하는 문서의 모든 필드를 표시하지 않을 수 있습니다. 쿼리 경로에 지정한 필드를 비롯하여 모든 필드를 보려면 결과에서 문서를 펼칩니다.

mongosh 에서 쿼리를 실행하는 방법은 다음과 같습니다.

1db.movies.aggregate([
2{
3 $search: {
4 "index": "default",
5 "compound": {
6 "filter": [{
7 "wildcard": {
8 "query": "Summer*",
9 "path": "title"
10 }
11 }],
12 "must": [{
13 "near": {
14 "pivot": 13149000000,
15 "path": "released",
16 "origin": ISODate("2014-04-18T00:00:00.000+00:00")
17 }
18 }]
19 },
20 "sort": {
21 "released": -1
22 }
23 }
24},
25{
26 $limit: 5
27},
28{
29 $project: {
30 "_id": 0,
31 "title": 1,
32 "released": 1,
33 "score": {
34 "$meta": "searchScore"
35 }
36 }
37}])
[
{
title: 'Summer Nights',
released: ISODate("2015-01-28T00:00:00.000Z"),
score: 0.348105788230896
},
{
title: 'Summertime',
released: ISODate("2014-08-01T00:00:00.000Z"),
score: 0.5917375683784485
},
{
title: 'Summer of Blood',
released: ISODate("2014-04-17T00:00:00.000Z"),
score: 0.9934720396995544
},
{
title: 'Summer Games',
released: ISODate("2012-02-08T00:00:00.000Z"),
score: 0.15982933342456818
},
{
title: 'Summer of Goliath',
released: ISODate("2011-07-08T00:00:00.000Z"),
score: 0.13038821518421173
}
]

MongoDB Compass 에서 드롭다운에서 단계를 선택하고 해당 단계에 대한 쿼리 추가하여 다음 파이프라인 단계를 각각 구성합니다. 단계를 추가하려면 Add Stage 을 클릭합니다.

파이프라인 단계
쿼리

$search

{
"index": "default",
"compound": {
"filter": [{
"wildcard": {
"query": "Summer*",
"path": "title"
}
}],
"must": [{
"near": {
"pivot": 13149000000,
"path": "released",
"origin": ISODate("2014-04-18T00:00:00.000+00:00")
}
}]
},
"sort": {
"released": -1
}
}

$limit

5

$project

{
_id: 0,
title: 1,
released: 1,
score: { $meta: "searchScore" }
}

Auto Preview를 활성화한 경우 MongoDB Compass는 $limit 파이프라인 단계 옆에 다음 문서를 표시합니다.

{
title: 'Summer Nights',
released: 2015-01-28T00:00:00.000+00:00,
score: 0.348105788230896
},
{
title: 'Summertime',
released: 2014-08-01T00:00:00.000+00:00,
score: 0.5917375683784485
},
{
title: 'Summer of Blood',
released: 2014-04-17T00:00:00.000+00:00,
score: 0.9934720396995544
},
{
title: 'Summer Games',
released: 2012-02-08T00:00:00.000+00:00,
score: 0.15982933342456818
},
{
title: 'Summer of Goliath',
released: 2011-07-08T00:00:00.000+00:00,
score: 0.13038821518421173
}
1
  1. Program.cs 파일의 내용을 다음 코드로 바꿉니다.

    1using MongoDB.Bson;
    2using MongoDB.Bson.Serialization.Attributes;
    3using MongoDB.Bson.Serialization.Conventions;
    4using MongoDB.Driver;
    5using MongoDB.Driver.Search;
    6
    7public class SortByStrings
    8{
    9 private const string MongoConnectionString = "<connection-string>";
    10
    11 public static void Main(string[] args)
    12 {
    13 // allow automapping of the camelCase database fields to our MovieDocument
    14 var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() };
    15 ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true);
    16
    17 // connect to your Atlas cluster
    18 var mongoClient = new MongoClient(MongoConnectionString);
    19 var mflixDatabase = mongoClient.GetDatabase("sample_mflix");
    20 var moviesCollection = mflixDatabase.GetCollection<MovieDocument>("movies");
    21
    22
    23 // declare data for compound query
    24 var originDate = new DateTime(2014, 04, 18, 0, 0, 0, DateTimeKind.Utc);
    25
    26 // define search options
    27 var searchOptions = new SearchOptions<MovieDocument>()
    28 {
    29 Sort = Builders<MovieDocument>.Sort.Descending(movie => movie.Released),
    30 IndexName = "default"
    31 };
    32
    33 // define and run pipeline
    34 var results = moviesCollection.Aggregate()
    35 .Search(Builders<MovieDocument>.Search.Compound()
    36 .Filter(Builders<MovieDocument>.Search.Wildcard(movie => movie.Title, "Summer*"))
    37 .Must(Builders<MovieDocument>.Search.Near(movie => movie.Released, originDate, 13149000000)), searchOptions)
    38 .Project<MovieDocument>(Builders<MovieDocument>.Projection
    39 .Include(movie => movie.Released)
    40 .Include(movie => movie.Title)
    41 .Exclude(movie => movie.Id)
    42 .MetaSearchScore(movie => movie.Score))
    43 .Limit(5)
    44 .ToList();
    45
    46 // print results
    47 foreach (var movie in results)
    48 {
    49 Console.WriteLine(movie.ToJson());
    50 }
    51 }
    52}
    53
    54[BsonIgnoreExtraElements]
    55public class MovieDocument
    56{
    57 [BsonIgnoreIfDefault]
    58 public ObjectId Id { get; set; }
    59 public DateTime Released { get; set; }
    60 public string Title { get; set; }
    61 public double Score { get; set; }
    62}
  2. <connection-string>을 지정합니다.

2
dotnet run Program.cs
{ "released" : ISODate("2015-01-28T00:00:00Z"), "title" : "Summer Nights", "score" : 0.348105788230896 }
{ "released" : ISODate("2014-08-01T00:00:00Z"), "title" : "Summertime", "score" : 0.59173756837844849 }
{ "released" : ISODate("2014-04-17T00:00:00Z"), "title" : "Summer of Blood", "score" : 0.99347203969955444 }
{ "released" : ISODate("2014-01-17T00:00:00Z"), "title" : "Summer in February", "score" : 0.62580311298370361 }
{ "released" : ISODate("2012-02-08T00:00:00Z"), "title" : "Summer Games", "score" : 0.15982933342456818 }
1
  1. sort-by-date.go라는 이름의 새 파일을 만들고 다음 코드를 붙여넣습니다.

    1package main
    2
    3import (
    4 "context"
    5 "fmt"
    6 "time"
    7
    8 "go.mongodb.org/mongo-driver/v2/bson"
    9 "go.mongodb.org/mongo-driver/v2/mongo"
    10 "go.mongodb.org/mongo-driver/v2/mongo/options"
    11)
    12
    13func main() {
    14 // connect to your Atlas cluster
    15 client, err := mongo.Connect(options.Client().ApplyURI("<connection-string"))
    16 if err != nil {
    17 panic(err)
    18 }
    19 defer client.Disconnect(context.TODO())
    20
    21 // set namespace
    22 collection := client.Database("sample_mflix").Collection("movies")
    23
    24 // define pipeline stages
    25 searchStage := bson.D{{Key: "$search", Value: bson.M{
    26 "index": "default",
    27 "compound": bson.M{
    28 "filter": bson.A{
    29 bson.M{
    30 "wildcard": bson.D{
    31 {Key: "path", Value: "title"},
    32 {Key: "query", Value: "Summer*"},
    33 }},
    34 },
    35 "must": bson.A{
    36 bson.M{
    37 "near": bson.M{
    38 "path": "released",
    39 "origin": time.Date(2014, time.April, 18, 0, 0, 0, 0, time.UTC),
    40 "pivot": 13149000000}},
    41 },
    42 },
    43 "sort": bson.D{{Key: "released", Value: -1}},
    44 }}}
    45
    46 limitStage := bson.D{{Key: "$limit", Value: 5}}
    47 projectStage := bson.D{{Key: "$project", Value: bson.D{{Key: "_id", Value: 0}, {Key: "title", Value: 1}, {Key: "released", Value: 1}, {Key: "score", Value: bson.D{{Key: "$meta", Value: "searchScore"}}}}}}
    48
    49 // run pipeline
    50 cursor, err := collection.Aggregate(context.TODO(), mongo.Pipeline{searchStage, limitStage, projectStage})
    51 if err != nil {
    52 panic(err)
    53 }
    54
    55 // print results
    56 var results []bson.D
    57 if err = cursor.All(context.TODO(), &results); err != nil {
    58 panic(err)
    59 }
    60 for _, result := range results {
    61 fmt.Println(result)
    62 }
    63}
  2. <connection-string>을 지정합니다.

2
go run sort-by-date.go
[{title Summer Nights} {released 1422403200000} {score 0.348105788230896}]
[{title Summertime} {released 1406851200000} {score 0.5917375683784485}]
[{title Summer of Blood} {released 1397692800000} {score 0.9934720396995544}]
[{title Summer Games} {released 1328659200000} {score 0.15982933342456818}]
[{title Summer of Goliath} {released 1310083200000} {score 0.13038821518421173}]
1
  1. SortByDate.java라는 이름의 새 파일을 만들고 다음 코드를 붙여넣습니다.

    1import java.util.Arrays;
    2import java.util.List;
    3
    4import static com.mongodb.client.model.Aggregates.limit;
    5import static com.mongodb.client.model.Aggregates.project;
    6import static com.mongodb.client.model.Projections.*;
    7import com.mongodb.client.MongoClient;
    8import com.mongodb.client.MongoClients;
    9import com.mongodb.client.MongoCollection;
    10import com.mongodb.client.MongoDatabase;
    11import org.bson.Document;
    12
    13import java.time.Instant;
    14import java.util.Date;
    15
    16public class SortByDate {
    17 public static void main( String[] args ) {
    18 // define query
    19 Document agg =
    20 new Document("$search",
    21 new Document("index", "default")
    22 .append("compound",
    23 new Document("filter", Arrays.asList(new Document("wildcard",
    24 new Document("query", "Summer*")
    25 .append("path", "title"))))
    26 .append("must", Arrays.asList(new Document("near",
    27 new Document("pivot", 13149000000L)
    28 .append("path", "released")
    29 .append("origin", Date.from(Instant.parse("2014-04-18T00:00:00.000+00:00")))))))
    30 .append("sort", new Document("released", -1)));
    31
    32 // specify connection
    33 String uri = "<connection-string>";
    34
    35 // establish connection and set namespace
    36 try (MongoClient mongoClient = MongoClients.create(uri)) {
    37 MongoDatabase database = mongoClient.getDatabase("sample_mflix");
    38 MongoCollection<Document> collection = database.getCollection("movies");
    39 // run query and print results
    40 collection.aggregate(Arrays.asList(agg,
    41 limit(5),
    42 project(fields(exclude("_id"), include("title"), include("released"), computed("score", new Document("$meta", "searchScore"))))))
    43 .forEach(doc -> System.out.println(doc.toJson()));
    44 }
    45 }
    46}

    참고

    Maven 환경에서 샘플 코드를 실행하려면 파일의 가져오기 문 위에 다음 코드를 추가합니다.

    package com.mongodb.drivers;
  2. <connection-string>을 지정합니다.

2
javac SortByDate.java
java SortByDate
{"title": "Summer Nights", "released": {"$date": "2015-01-28T00:00:00Z"}, "score": 0.348105788230896}
{"title": "Summertime", "released": {"$date": "2014-08-01T00:00:00Z"}, "score": 0.5917375683784485}
{"title": "Summer of Blood", "released": {"$date": "2014-04-17T00:00:00Z"}, "score": 0.9934720396995544}
{"title": "Summer Games", "released": {"$date": "2012-02-08T00:00:00Z"}, "score": 0.15982933342456818}
{"title": "Summer of Goliath", "released": {"$date": "2011-07-08T00:00:00Z"}, "score": 0.13038821518421173}
1
  1. SortByDate.kt라는 이름의 새 파일을 만들고 다음 코드를 붙여넣습니다.

    1import com.mongodb.client.model.Aggregates.limit
    2import com.mongodb.client.model.Aggregates.project
    3import com.mongodb.client.model.Projections.*
    4import com.mongodb.kotlin.client.coroutine.MongoClient
    5import kotlinx.coroutines.runBlocking
    6import org.bson.Document
    7import java.time.Instant
    8import java.util.*
    9
    10fun main() {
    11 // establish connection and set namespace
    12 val uri = "<connection-string>"
    13 val mongoClient = MongoClient.create(uri)
    14 val database = mongoClient.getDatabase("sample_mflix")
    15 val collection = database.getCollection<Document>("movies")
    16
    17 runBlocking {
    18 // define query
    19 val agg = Document(
    20 "\$search",
    21 Document("index", "default")
    22 .append(
    23 "compound",
    24 Document(
    25 "filter", listOf(
    26 Document(
    27 "wildcard",
    28 Document("query", "Summer*")
    29 .append("path", "title")
    30 )
    31 )
    32 )
    33 .append(
    34 "must", listOf(
    35 Document(
    36 "near",
    37 Document("pivot", 13149000000L)
    38 .append("path", "released")
    39 .append("origin", Date.from(Instant.parse("2014-04-18T00:00:00.000+00:00")))
    40 )
    41 )
    42 )
    43 )
    44 .append("sort", Document("released", -1))
    45 )
    46
    47 // run query and print results
    48 val resultsFlow = collection.aggregate<Document>(
    49 listOf(
    50 agg,
    51 limit(5),
    52 project(fields(
    53 excludeId(),
    54 include("title", "released"),
    55 computed("score", Document("\$meta", "searchScore"))
    56 ))
    57 )
    58 )
    59 resultsFlow.collect { println(it) }
    60 }
    61 mongoClient.close()
    62}
  2. <connection-string>을 지정합니다.

2
kotlin SortByDate.kt
Document{{title=Summer Nights, released=Tue Jan 27 19:00:00 EST 2015, score=0.348105788230896}}
Document{{title=Summertime, released=Thu Jul 31 20:00:00 EDT 2014, score=0.5917375683784485}}
Document{{title=Summer of Blood, released=Wed Apr 16 20:00:00 EDT 2014, score=0.9934720396995544}}
Document{{title=Summer Games, released=Tue Feb 07 19:00:00 EST 2012, score=0.15982933342456818}}
Document{{title=Summer of Goliath, released=Thu Jul 07 20:00:00 EDT 2011, score=0.13038821518421173}}
1
  1. sort-by-date.js라는 이름의 새 파일을 만들고 다음 코드를 붙여넣습니다.

    1const { MongoClient } = require("mongodb");
    2
    3// Replace the uri string with your MongoDB deployments connection string.
    4const uri =
    5 "<connection-string>";
    6
    7const client = new MongoClient(uri);
    8
    9async function run() {
    10 try {
    11 await client.connect();
    12
    13 // set namespace
    14 const database = client.db("sample_mflix");
    15 const coll = database.collection("movies");
    16
    17 // define pipeline
    18 const agg = [
    19 {$search: {
    20 index: "default",
    21 compound: {
    22 filter: {wildcard: {query: "Summer*", path: "title"}},
    23 must: [{near: {path: "released", origin: new Date("2014-04-18T00:00:00.000Z"), pivot: 13149000000}}]
    24 },
    25 sort: { released: -1 }
    26 }},
    27 {$limit: 5},
    28 {$project: {_id: 0, title: 1, released: 1, score: {$meta: "searchScore"}}}
    29 ];
    30
    31 // run pipeline
    32 const result = await coll.aggregate(agg);
    33
    34 // print results
    35 await result.forEach((doc) => console.log(doc));
    36
    37 } finally {
    38 await client.close();
    39 }
    40}
    41run().catch(console.dir);
  2. <connection-string>을 지정합니다.

2
node sort-by-date.js
{
title: 'Summer Nights',
released: 2015-01-28T00:00:00.000Z,
score: 0.348105788230896
}
{
title: 'Summertime',
released: 2014-08-01T00:00:00.000Z,
score: 0.5917375683784485
}
{
title: 'Summer of Blood',
released: 2014-04-17T00:00:00.000Z,
score: 0.9934720396995544
}
{
title: 'Summer Games',
released: 2012-02-08T00:00:00.000Z,
score: 0.15982933342456818
}
{
title: 'Summer of Goliath',
released: 2011-07-08T00:00:00.000Z,
score: 0.13038821518421173
}
1
  1. sort-by-date.py라는 이름의 새 파일을 만들고 다음 코드를 붙여넣습니다.

    1import datetime
    2import pymongo
    3
    4# connect to your Atlas cluster
    5client = pymongo.MongoClient('<connection-string>')
    6
    7# define pipeline
    8pipeline = [
    9 {'$search': {
    10 'index': 'default',
    11 'compound': {
    12 'filter': {'wildcard': {'query': 'Summer*', 'path': 'title'}},
    13 'must': {'near': {
    14 "path": "released",
    15 "origin": datetime.datetime(2014, 4, 18, 0, 0, 0, 0),
    16 "pivot": 13149000000
    17 }}},
    18 'sort': { 'released': -1 }}},
    19 {'$limit': 5},
    20 {'$project': {'_id': 0, 'title': 1, 'released': 1, 'score': {'$meta': 'searchScore'}}}
    21]
    22
    23# run pipeline
    24result = client['sample_mflix']['movies'].aggregate(pipeline)
    25
    26# print results
    27for i in result:
    28 print(i)
  2. <connection-string>을 지정합니다.

2
python sort-by-date.py
{'title': 'Summer Nights', 'released': datetime.datetime(2015, 1, 28, 0, 0), 'score': 0.348105788230896}
{'title': 'Summertime', 'released': datetime.datetime(2014, 8, 1, 0, 0), 'score': 0.5917375683784485}
{'title': 'Summer of Blood', 'released': datetime.datetime(2014, 4, 17, 0, 0), 'score': 0.9934720396995544}
{'title': 'Summer Games', 'released': datetime.datetime(2012, 2, 8, 0, 0), 'score': 0.15982933342456818}
{'title': 'Summer of Goliath', 'released': datetime.datetime(2011, 7, 8, 0, 0), 'score': 0.13038821518421173}

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

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

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

  • $limit 단계는 출력을 5 결과로만 제한합니다.

  • titleawards.wins를 제외한 모든 필드를 제외하려면 $project 단계를 수행합니다.

1

다음 쿼리를 복사하여 Query Editor에 붙여 넣은 다음 Query Editor에서 Search 버튼을 클릭합니다.

[
{
"$search": {
"range": {
"path": "awards.wins",
"gte": 10
},
"sort": {
"awards.wins": -1,
}
}
}
]
SCORE: 1 _id: "573a13d5f29313caabd9cae7"
fullplot: "Based on an incredible true story of one man's fight for survival and …"
imdb: Object
...
year: 2013
...
awards: Object
wins: 267
...
...
SCORE: 1 _id: "573a13c7f29313caabd74a4d"
fullplot: "Dr. Ryan Stone (Sandra Bullock) is a brilliant medical engineer on her…"
imdb: Object
...
year: 2013
...
awards: Object
wins: 231
...
...
SCORE: 1 _id: "573a13cbf29313caabd808d2"
fullplot: "Dr. Ryan Stone (Sandra Bullock) is a brilliant medical engineer on her…"
imdb: Object
...
year: 2013
...
awards: Object
wins: 231
...
...
SCORE: 1 _id: “573a13dff29313caabdb7adb”"
fullplot: "Actor Riggan Thomson is most famous for his movie role from over twent…"
imdb: Object
...
year: 2014
...
awards: Object
wins: 210
...
...
SCORE: 1 _id: "573a13bef29313caabd5c06c"
plot: "The life of Mason, from early childhood to his arrival at college."
imdb: Object
...
runtime: 165
...
awards: Object
wins: 185
...
...
SCORE: 1 _id: "573a139ef29313caabcfbd6a"
fullplot: "While Frodo & Sam continue to approach Mount Doom to destroy the One R…"
imdb: Object
...
year: 2003
...
awards: Object
wins: 175
...
...
SCORE: 1 _id: "573a13b5f29313caabd447f5"
plot: "In rural Texas, welder and hunter Llewelyn Moss discovers the remains …"
imdb: Object
...
year: 2007
...
awards: Object
wins: 172
...
...
SCORE: 1 _id: "573a13c3f29313caabd68d9f"
plot: "On a fall night in 2003, Harvard undergrad and computer programming ge…"
imdb: Object
...
year: 2010
...
awards: Object
wins: 171
...
...
SCORE: 1 _id: "573a13c5f29313caabd6ee61"
fullplot: "Dom Cobb is a skilled thief, the absolute best in the dangerous art of…"
imdb: Object
...
year: 2010
...
awards: Object
wins: 162
...
...
SCORE: 1 _id: "573a13bdf29313caabd58fd3"
plot: "The story of Jamal Malik, an 18 year-old orphan from the slums of Mumb…"
imdb: Object
...
year: 2008
...
awards: Object
wins: 161
...
...
2

Search Tester는 반환하는 문서의 모든 필드를 표시하지 않을 수 있습니다. 쿼리 경로에 지정한 필드를 비롯하여 모든 필드를 보려면 결과에서 문서를 펼칩니다.

mongosh 에서 쿼리를 실행하는 방법은 다음과 같습니다.

1db.movies.aggregate([
2 {
3 "$search": {
4 "range": {
5 "path": "awards.wins",
6 "gte": 10
7 },
8 "sort": {
9 "awards.wins": -1,
10 }
11 }
12 },
13 {
14 $limit: 5
15 },
16 {
17 "$project": {
18 "_id": 0,
19 "title": 1,
20 "awards.wins": 1
21 }
22 }
23])
[
{
title: '12 Years a Slave',
awards: { wins: 267 }
},
{
title: 'Gravity',
awards: { wins: 231 }
},
{
title: 'Gravity',
awards: { wins: 231 }
},
{
title: 'Birdman: Or (The Unexpected Virtue of Ignorance)',
awards: { wins: 210 }
},
{
title: 'Boyhood',
awards: { wins: 185 }
}
]

MongoDB Compass 에서 드롭다운에서 단계를 선택하고 해당 단계에 대한 쿼리 추가하여 다음 파이프라인 단계를 각각 구성합니다. 단계를 추가하려면 Add Stage 을 클릭합니다.

파이프라인 단계
쿼리

$search

{
index: "default",
"range": {
"path": "awards.wins",
"gte": 10
},
"sort": {
"awards.wins": -1,
}
}

$limit

5

$project

{
title: 1,
released: 1,
year: 1
}

Auto Preview를 활성화한 경우 MongoDB Compass는 $limit 파이프라인 단계 옆에 다음 문서를 표시합니다.

[
{
title: '12 Years a Slave',
awards: { wins: 267 }
},
{
title: 'Gravity',
awards: { wins: 231 }
},
{
title: 'Gravity',
awards: { wins: 231 }
},
{
title: 'Birdman: Or (The Unexpected Virtue of Ignorance)',
awards: { wins: 210 }
},
{
title: 'Boyhood',
awards: { wins: 185 }
}
]
1
  1. 프로젝트에서 Program.cs 파일의 내용을 다음 코드로 바꿉니다.

    1using MongoDB.Bson;
    2using MongoDB.Bson.Serialization.Attributes;
    3using MongoDB.Bson.Serialization.Conventions;
    4using MongoDB.Driver;
    5using MongoDB.Driver.Search;
    6
    7public class SortByNumbers
    8{
    9 private const string MongoConnectionString = "<connection-string>";
    10
    11 public static void Main(string[] args)
    12 {
    13 // allow automapping of the camelCase database fields to our MovieDocument
    14 var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() };
    15 ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true);
    16
    17 // connect to your Atlas cluster
    18 var mongoClient = new MongoClient(MongoConnectionString);
    19 var mflixDatabase = mongoClient.GetDatabase("sample_mflix");
    20 var moviesCollection = mflixDatabase.GetCollection<MovieDocument>("movies");
    21
    22 // define search options
    23 var searchOptions = new SearchOptions<MovieDocument>()
    24 {
    25 Sort = Builders<MovieDocument>.Sort.Descending(movies => movies.Awards.Wins),
    26 IndexName = "default"
    27 };
    28
    29 // define and run pipeline
    30 var results = moviesCollection.Aggregate()
    31 .Search(
    32 Builders<MovieDocument>.Search.Range(movie => movie.Awards.Wins, SearchRangeBuilder.Gte(10)), searchOptions)
    33 .Project<MovieDocument>(Builders<MovieDocument>.Projection
    34 .Exclude(movie => movie.Id)
    35 .Include(movie => movie.Title)
    36 .Include(movie => movie.Awards.Wins))
    37 .Limit(5)
    38 .ToList();
    39
    40 // print results
    41 foreach (var movie in results)
    42 {
    43 Console.WriteLine(movie.ToJson());
    44 }
    45 }
    46}
    47
    48[BsonIgnoreExtraElements]
    49public class MovieDocument
    50{
    51 [BsonIgnoreIfDefault]
    52 public ObjectId Id { get; set; }
    53 public string Title { get; set; }
    54 public Award Awards { get; set; }
    55}
    56
    57public class Award
    58{
    59 [BsonIgnoreIfDefault]
    60 public int Wins { get; set; }
    61}
  2. <connection-string>을 지정합니다.

2
dotnet run Program.cs
{ "title" : "12 Years a Slave", "awards" : { "wins" : 267 } }
{ "title" : "Gravity", "awards" : { "wins" : 231 } }
{ "title" : "Gravity", "awards" : { "wins" : 231 } }
{ "title" : "Birdman: Or (The Unexpected Virtue of Ignorance)", "awards" : { "wins" : 210 } }
{ "title" : "Boyhood", "awards" : { "wins" : 185 } }
1
  1. sort-by-numbers.go라는 이름의 새 파일을 만들고 다음 코드를 붙여넣습니다.

    1package main
    2
    3import (
    4 "context"
    5 "fmt"
    6
    7 "go.mongodb.org/mongo-driver/v2/bson"
    8 "go.mongodb.org/mongo-driver/v2/mongo"
    9 "go.mongodb.org/mongo-driver/v2/mongo/options"
    10)
    11
    12func main() {
    13 // connect to your Atlas cluster
    14 client, err := mongo.Connect(options.Client().ApplyURI("<connection-string>"))
    15 if err != nil {
    16 panic(err)
    17 }
    18 defer client.Disconnect(context.TODO())
    19
    20 // set namespace
    21 collection := client.Database("sample_mflix").Collection("movies")
    22
    23 // define pipeline stages
    24 searchStage := bson.D{{Key: "$search", Value: bson.D{
    25 {Key: "index", Value: "default"},
    26 {Key: "range", Value: bson.D{
    27 {Key: "path", Value: "awards.wins"},
    28 {Key: "gte", Value: 10},
    29 }},
    30 {Key: "sort", Value: bson.D{{Key: "awards.wins", Value: -1}}},
    31 }}}
    32 limitStage := bson.D{{Key: "$limit", Value: 5}}
    33 projectStage := bson.D{{Key: "$project", Value: bson.D{{Key: "title", Value: 1}, {Key: "awards.wins", Value: 1}, {Key: "_id", Value: 0}}}}
    34
    35 // run pipeline
    36 cursor, err := collection.Aggregate(context.TODO(), mongo.Pipeline{searchStage, limitStage, projectStage})
    37 if err != nil {
    38 panic(err)
    39 }
    40
    41 // print results
    42 var results []bson.D
    43 if err = cursor.All(context.TODO(), &results); err != nil {
    44 panic(err)
    45 }
    46 for _, result := range results {
    47 fmt.Println(result)
    48 }
    49}
  2. <connection-string>을 지정합니다.

2
go run sort-by-numbers.go
[{title 12 Years a Slave} {awards [{wins 267}]}]
[{title Gravity} {awards [{wins 231}]}]
[{title Gravity} {awards [{wins 231}]}]
[{title Birdman: Or (The Unexpected Virtue of Ignorance)} {awards [{wins 210}]}]
[{title Boyhood} {awards [{wins 185}]}]
1
  1. SortByNumbers.java라는 이름의 새 파일을 만들고 다음 코드를 붙여넣습니다.

    1import java.util.Arrays;
    2
    3import static com.mongodb.client.model.Aggregates.limit;
    4import static com.mongodb.client.model.Aggregates.project;
    5import static com.mongodb.client.model.Projections.excludeId;
    6import static com.mongodb.client.model.Projections.fields;
    7import static com.mongodb.client.model.Projections.include;
    8import com.mongodb.client.MongoClient;
    9import com.mongodb.client.MongoClients;
    10import com.mongodb.client.MongoCollection;
    11import com.mongodb.client.MongoDatabase;
    12import org.bson.Document;
    13
    14public class SortByNumbers {
    15 public static void main( String[] args ) {
    16 // define query
    17 Document agg =
    18 new Document("$search",
    19 new Document("index", "default")
    20 .append("range",
    21 new Document("path", "awards.wins")
    22 .append("gte", 10L))
    23 .append("sort",
    24 new Document("awards.wins", -1L)));
    25
    26 // specify connection
    27 String uri = "<connection-string>";
    28
    29 // establish connection and set namespace
    30 try (MongoClient mongoClient = MongoClients.create(uri)) {
    31 MongoDatabase database = mongoClient.getDatabase("sample_mflix");
    32 MongoCollection<Document> collection = database.getCollection("movies");
    33
    34 // run query and print results
    35 collection.aggregate(Arrays.asList(agg,
    36 limit(5),
    37 project(fields(excludeId(), include("title"), include("awards.wins")))))
    38 .forEach(doc -> System.out.println(doc.toJson()));
    39 }
    40 }
    41}

    참고

    Maven 환경에서 샘플 코드를 실행하려면 파일의 가져오기 문 위에 다음 코드를 추가합니다.

    package com.mongodb.drivers;
  2. <connection-string>을 지정합니다.

2
javac SortByNumbers.java
java SortByNumbers
{"title": "12 Years a Slave", "awards": {"wins": 267}}
{"title": "Gravity", "awards": {"wins": 231}}
{"title": "Gravity", "awards": {"wins": 231}}
{"title": "Birdman: Or (The Unexpected Virtue of Ignorance)", "awards": {"wins": 210}}
{"title": "Boyhood", "awards": {"wins": 185}}
1
  1. SortByNumbers.kt라는 이름의 새 파일을 만들고 다음 코드를 붙여넣습니다.

    1import com.mongodb.client.model.Aggregates.limit
    2import com.mongodb.client.model.Aggregates.project
    3import com.mongodb.client.model.Projections.*
    4import com.mongodb.kotlin.client.coroutine.MongoClient
    5import kotlinx.coroutines.runBlocking
    6import org.bson.Document
    7
    8fun main() {
    9 // establish connection and set namespace
    10 val uri = "<connection-string>"
    11 val mongoClient = MongoClient.create(uri)
    12 val database = mongoClient.getDatabase("sample_mflix")
    13 val collection = database.getCollection<Document>("movies")
    14
    15 runBlocking {
    16 // define query
    17 val agg = Document(
    18 "\$search",
    19 Document("index", "default")
    20 .append(
    21 "range",
    22 Document("path", "awards.wins")
    23 .append("gte", 10L)
    24 )
    25 .append(
    26 "sort",
    27 Document("awards.wins", -1L)
    28 )
    29 )
    30
    31 // run query and print results
    32 val resultsFlow = collection.aggregate<Document>(
    33 listOf(
    34 agg,
    35 limit(5),
    36 project(fields(
    37 excludeId(),
    38 include("title", "awards.wins")
    39 ))
    40 )
    41 )
    42 resultsFlow.collect { println(it) }
    43 }
    44 mongoClient.close()
    45}
  2. <connection-string>을 지정합니다.

2
kotlin SortByNumbers.kt
Document{{title=12 Years a Slave, awards=Document{{wins=267}}}}
Document{{title=Gravity, awards=Document{{wins=231}}}}
Document{{title=Gravity, awards=Document{{wins=231}}}}
Document{{title=Birdman: Or (The Unexpected Virtue of Ignorance), awards=Document{{wins=210}}}}
Document{{title=Boyhood, awards=Document{{wins=185}}}}
1
  1. sort-by-numbers.js라는 이름의 새 파일을 만들고 다음 코드를 붙여넣습니다.

    1const { MongoClient } = require("mongodb");
    2
    3// Replace the uri string with your MongoDB deployments connection string.
    4const uri =
    5 "<connection-string>";
    6
    7const client = new MongoClient(uri);
    8
    9async function run() {
    10 try {
    11 await client.connect();
    12
    13 // set namespace
    14 const database = client.db("sample_mflix");
    15 const coll = database.collection("movies");
    16
    17 // define pipeline
    18 const agg = [
    19 {
    20 '$search': {
    21 'index': 'default',
    22 'range': {
    23 'path': 'awards.wins',
    24 'gte': 10
    25 },
    26 'sort': {
    27 'awards.wins': -1
    28 }
    29 }
    30 }, {
    31 '$limit': 5
    32 }, {
    33 '$project': {
    34 '_id': 0,
    35 'title': 1,
    36 'awards.wins': 1
    37 }
    38 }
    39 ];
    40
    41 // run pipeline
    42 const result = await coll.aggregate(agg);
    43
    44 // print results
    45 await result.forEach((doc) => console.log(doc));
    46
    47 } finally {
    48 await client.close();
    49 }
    50}
    51run().catch(console.dir);
  2. <connection-string>을 지정합니다.

2
node sort-by-numbers.js
{ title: '12 Years a Slave', awards: { wins: 267 } }
{ title: 'Gravity', awards: { wins: 231 } }
{ title: 'Gravity', awards: { wins: 231 } }
{
title: 'Birdman: Or (The Unexpected Virtue of Ignorance)',
awards: { wins: 210 }
}
{ title: 'Boyhood', awards: { wins: 185 } }
1
  1. sort-by-numbers.py라는 이름의 새 파일을 만들고 다음 코드를 붙여넣습니다.

    1import pymongo
    2
    3# connect to your Atlas cluster
    4client = pymongo.MongoClient('<connection-string>')
    5
    6# define pipeline
    7pipeline = [
    8 {
    9 '$search': {
    10 'index': 'default',
    11 'range': {
    12 'path': 'awards.wins',
    13 'gte': 10
    14 },
    15 'sort': {
    16 'awards.wins': -1
    17 }
    18 }
    19 }, {
    20 '$limit': 5
    21 }, {
    22 '$project': {'_id': 0, 'title': 1, 'awards.wins': 1
    23 }
    24 }
    25]
    26
    27# run pipeline
    28result = client['sample_mflix']['movies'].aggregate(pipeline)
    29
    30# print results
    31for i in result:
    32 print(i)
  2. <connection-string>을 지정합니다.

2
python sort-by-numbers.py
{'title': '12 Years a Slave', 'awards': {'wins': 267}}
{'title': 'Gravity', 'awards': {'wins': 231}}
{'title': 'Gravity', 'awards': {'wins': 231}}
{'title': 'Birdman: Or (The Unexpected Virtue of Ignorance)', 'awards': {'wins': 210}}
{'title': 'Boyhood', 'awards': {'wins': 185}}

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

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

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

이 쿼리는 $limit 단계를 사용하여 출력을 5 문서로 제한합니다. 또한 $project 단계를 사용하여 다음을 수행합니다.

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

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

db.movies.aggregate([
{
"$search": {
"text": {
"path": "title",
"query": "country"
},
"sort": {
"title": 1
}
}
},
{
"$limit": 5
},
{
"$project": {
"_id": 0,
"title": 1,
"score": { "$meta": "searchScore" }
}
}
])
[
{ title: 'A Country Called Home', score: 2.536633253097534 },
{ title: 'A Month in the Country', score: 2.258953094482422 },
{ title: 'A Quiet Place in the Country', score: 2.0360684394836426 },
{ title: 'A Sunday in the Country', score: 2.258953094482422 },
{ title: 'Another Country', score: 3.3635599613189697 }
]

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

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

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

  • $limit 단계는 출력을 5 결과로만 제한합니다.

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

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

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

[
{
$search: {
"compound": {
"should": [{
"wildcard": {
"query": ["Prance*"],
"path": "title",
"allowAnalyzedField": true
}
},
{
"wildcard": {
"query": ["Prince*"],
"path": "title",
"allowAnalyzedField": true
}
}]
},
"sort": {
"title": 1
}
}
}
]
SCORE: 1 _id: "573a1398f29313caabceb98e"
plot: "A farm girl nurses a wounded reindeer she believes is one of Santa's, …"
genres: Array
runtime: 103
...
title: "Prancer"
...
SCORE: 1 _id: "573a13a5f29313caabd14f54"
plot: "Preteen brothers from a broken marriage live with their mother, Denise…"
genres: Array
runtime: 91
...
title: "Prancer Returns"
...
SCORE: 1 _id: "573a13f5f29313caabde3755"
plot: "A troubled teenager attempts to conquer the love of his life by becomi…"
genres: Array
runtime: 78
...
title: "Prince"
...
SCORE: 1 _id: "573a13d8f29313caabda665f"
fullplot: "Two highway road workers spend the summer of 1988 away from their city…"
imdb: Object
year: 2013
...
title: "Prince Avalanche"
...
SCORE: 1 _id: "573a13bdf29313caabd5898a"
plot: "A New York street drama about the lives of immigrants in America seeki…"
genres: Array
runtime: 70
...
title: "Prince of Broadway"
...
SCORE: 1 _id: "573a1398f29313caabcea967"
fullplot: "A sinister secret has been kept in the basement of an abandoned Los An…"
imdb: Object
year: 1987
...
title: "Prince of Darkness"
...
SCORE: 1 _id: "573a1393f29313caabcde40d"
plot: "An unscrupulous agent for the Borgias suffers a change of heart when a…"
genres: Array
runtime: 107
...
title: "Princess of Foxes"
...
SCORE: 1 _id: "573a13b5f29313caabd43816"
plot: "A young fugitive prince and princess must stop a villain who unknowing…"
genres: Array
runtime: 116
...
title: "Prince of Persia: The Sands of Time"
...
SCORE: 1 _id: "573a1397f29313caabce8081"
plot: "A New York City narcotics detective reluctantly agrees to cooperate wi…"
genres: Array
runtime: 167
...
title: "Prince of the City"
...
SCORE: 1 _id: "573a13a2f29313caabd0a767"
plot: "Six old-style funny silhouetted fairy tales for not so-old-style peopl…"
genres: Array
runtime: 70
...
title: "Princes and Princesses"
...

Atlas Search 결과에는 PrancePrince로 시작하는 영화 제목이 있는 문서가 포함되어 있습니다. Atlas Search는 title 필드를 기준으로 문서를 오름차순으로 정렬하기 때문에 Prance 다음에 Prince가 있는 제목을 반환합니다.

Search Tester는 반환하는 문서의 모든 필드를 표시하지 않을 수 있습니다. 쿼리 경로에 지정한 필드를 비롯하여 모든 필드를 보려면 결과에서 문서를 펼칩니다.

1db.movies.aggregate([{
2 $search: {
3 "index": "default",
4 "compound": {
5 "should": [{
6 "wildcard": {
7 "query": ["Prance*"],
8 "path": "title",
9 "allowAnalyzedField": true
10 }
11 },
12 {
13 "wildcard": {
14 "query": ["Prince*"],
15 "path": "title",
16 "allowAnalyzedField": true
17 }
18 }]
19 },
20 "sort": {
21 "title": 1
22 }
23 }},
24 {
25 $limit: 5
26 },
27 {
28 $project: {
29 "_id": 0,
30 "title": 1,
31 "score": { "$meta": "searchScore" }
32 }
33 }
34])
[
{ title: 'Prancer', score: 1 },
{ title: 'Prancer Returns', score: 1 },
{ title: 'Prince', score: 1 },
{ title: 'Prince Avalanche', score: 1 },
{ title: 'Prince of Broadway', score: 1 }
]

Atlas Search 결과에는 PrancePrince로 시작하는 영화 제목이 있는 문서가 포함되어 있습니다. Atlas Search는 title 필드를 기준으로 문서를 오름차순으로 정렬하기 때문에 Prance 다음에 Prince가 있는 제목을 반환합니다.

파이프라인 단계
쿼리

$search

{
compound: {
should: [{
wildcard: {
query: "Prance*",
path: 'title',
allowAnalyzedField: true
}},
{
wildcard: {
query: "Prince*",
path: 'title',
allowAnalyzedField: true
}
}]
},
sort: {
title: 1
}
}

$limit

5

$project

{
_id: 0,
title: 1,
score: { $meta: "searchScore" }
}

Auto Preview를 활성화한 경우 MongoDB Compass는 $project 파이프라인 단계 옆에 다음 문서를 표시합니다.

{
title: 'Prancer',
score: 1
},
{
title: 'Prancer Returns',
score: 1
},
{
title: 'Prince',
score: 1
},
{
title: 'Prince Avalanche',
score: 1
},
{
title: 'Prince of Boradway',
score: 1
}

Atlas Search 결과에는 PrancePrince로 시작하는 영화 제목이 있는 문서가 포함되어 있습니다. Atlas Search는 title 필드를 기준으로 문서를 오름차순으로 정렬하기 때문에 Prance 다음에 Prince가 있는 제목을 반환합니다.

이 코드 예시에서는 다음 작업을 수행합니다:

  • mongodb 패키지 및 종속성을 가져옵니다.

  • Atlas 클러스터에 대한 연결을 설정합니다.

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

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

    • $limit 단계는 출력을 5 결과로만 제한합니다.

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

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

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

  • 커서 위를 반복하여 쿼리와 일치하는 문서를 인쇄합니다.

1using MongoDB.Bson;
2using MongoDB.Bson.Serialization.Attributes;
3using MongoDB.Bson.Serialization.Conventions;
4using MongoDB.Driver;
5using MongoDB.Driver.Search;
6
7public class SortByStrings
8{
9 private const string MongoConnectionString = "<connection-string>";
10
11 public static void Main(string[] args)
12 {
13 // allow automapping of the camelCase database fields to our MovieDocument
14 var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() };
15 ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true);
16
17 // connect to your Atlas cluster
18 var mongoClient = new MongoClient(MongoConnectionString);
19 var mflixDatabase = mongoClient.GetDatabase("sample_mflix");
20 var moviesCollection = mflixDatabase.GetCollection<MovieDocument>("movies");
21
22 // define search options
23 var searchOptions = new SearchOptions<MovieDocument>()
24 {
25 Sort = Builders<MovieDocument>.Sort.Ascending(movie => movie.Title),
26 IndexName = "default"
27 };
28
29 // define and run pipeline
30 var results = moviesCollection.Aggregate()
31 .Search(Builders<MovieDocument>.Search.Compound()
32 .Should(Builders<MovieDocument>.Search.Wildcard(movie => movie.Title, "Prance*", true ))
33 .Should(Builders<MovieDocument>.Search.Wildcard(movie => movie.Title, "Prince*" )), searchOptions)
34 .Project<MovieDocument>(Builders<MovieDocument>.Projection
35 .Include(movie => movie.Title)
36 .Exclude(movie => movie.Id)
37 .MetaSearchScore(movie => movie.Score))
38 .Limit(5)
39 .ToList();
40
41 // print results
42 foreach (var movie in results)
43 {
44 Console.WriteLine(movie.ToJson());
45 }
46 }
47}
48
49[BsonIgnoreExtraElements]
50public class MovieDocument
51{
52 [BsonIgnoreIfDefault]
53 public ObjectId Id { get; set; }
54 public string Title { get; set; }
55 public double Score { get; set; }
56}
{ "title" : "Prancer", "score" : 1.0 }
{ "title" : "Prancer Returns", "score" : 1.0 }
{ "title" : "Prince", "score" : 1.0 }
{ "title" : "Prince Avalanche", "score" : 1.0 }
{ "title" : "Prince of Broadway", "score" : 1.0 }

Atlas Search 결과에는 PrancePrince로 시작하는 영화 제목이 있는 문서가 포함되어 있습니다. Atlas Search는 title 필드를 기준으로 문서를 오름차순으로 정렬하기 때문에 Prance 다음에 Prince가 있는 제목을 반환합니다.

이 코드 예시에서는 다음 작업을 수행합니다:

  • mongodb 패키지 및 종속성을 가져옵니다.

  • Atlas 클러스터에 대한 연결을 설정합니다.

  • 커서 위를 반복하여 쿼리와 일치하는 문서를 인쇄합니다.

1package main
2
3import (
4 "context"
5 "fmt"
6
7 "go.mongodb.org/mongo-driver/v2/bson"
8 "go.mongodb.org/mongo-driver/v2/mongo"
9 "go.mongodb.org/mongo-driver/v2/mongo/options"
10)
11
12func main() {
13 // connect to your Atlas cluster
14 client, err := mongo.Connect(options.Client().ApplyURI("<connection-string>"))
15 if err != nil {
16 panic(err)
17 }
18 defer client.Disconnect(context.TODO())
19
20 // set namespace
21 collection := client.Database("sample_mflix").Collection("movies")
22
23 // define pipeline stages
24 searchStage := bson.D{{Key: "$search", Value: bson.M{
25 "index": "default",
26 "compound": bson.M{
27 "should": bson.A{
28 bson.M{
29 "wildcard": bson.D{
30 {Key: "path", Value: "title"},
31 {Key: "query", Value: "Prance*"},
32 {Key: "allowAnalyzedField", Value: true},
33 }},
34 bson.M{
35 "wildcard": bson.D{
36 {Key: "path", Value: "title"},
37 {Key: "query", Value: "Prince*"},
38 {Key: "allowAnalyzedField", Value: true},
39 }},
40 },
41 },
42 "sort": bson.D{{Key: "title", Value: 1}},
43 }}}
44
45 limitStage := bson.D{{Key: "$limit", Value: 5}}
46 projectStage := bson.D{{Key: "$project", Value: bson.D{{Key: "title", Value: 1}, {Key: "_id", Value: 0}, {Key: "score", Value: bson.D{{Key: "$meta", Value: "searchScore"}}}}}}
47
48 // run pipeline
49 cursor, err := collection.Aggregate(context.TODO(), mongo.Pipeline{searchStage, limitStage, projectStage})
50 if err != nil {
51 panic(err)
52 }
53
54 // print results
55 var results []bson.D
56 if err = cursor.All(context.TODO(), &results); err != nil {
57 panic(err)
58 }
59 for _, result := range results {
60 fmt.Println(result)
61 }
62}
[{title Prancer} {score 1}]
[{title Prancer Returns} {score 1}]
[{title Prince} {score 1}]
[{title Prince Avalanche} {score 1}]
[{title Prince of Broadway} {score 1}]

Atlas Search 결과에는 PrancePrince로 시작하는 영화 제목이 있는 문서가 포함되어 있습니다. Atlas Search는 title 필드를 기준으로 문서를 오름차순으로 정렬하기 때문에 Prance 다음에 Prince가 있는 제목을 반환합니다.

이 코드 예시에서는 다음 작업을 수행합니다:

  • mongodb 패키지 및 종속성을 가져옵니다.

  • Atlas 클러스터에 대한 연결을 설정합니다.

  • 커서 위를 반복하여 쿼리와 일치하는 문서를 인쇄합니다.

1import java.util.Arrays;
2import java.util.List;
3
4import static com.mongodb.client.model.Aggregates.limit;
5import static com.mongodb.client.model.Aggregates.project;
6import static com.mongodb.client.model.Projections.*;
7import com.mongodb.client.MongoClient;
8import com.mongodb.client.MongoClients;
9import com.mongodb.client.MongoCollection;
10import com.mongodb.client.MongoDatabase;
11import org.bson.Document;
12
13import java.util.Date;
14
15public class SortByString {
16 public static void main( String[] args ) {
17 // define clause
18 List<Document> shouldClause =
19 List.of(
20 new Document(
21 "wildcard",
22 new Document("query", "Prance*")
23 .append("path", "title")
24 .append("allowAnalyzedField", true)),
25 new Document(
26 "wildcard",
27 new Document("query", "Prince*")
28 .append("path", "title")
29 .append("allowAnalyzedField", true)));
30
31 // define query
32 Document agg =
33 new Document(
34 "$search",
35 new Document("index", "default")
36 .append("compound",
37 new Document("should", shouldClause))
38 .append("sort", new Document("title", 1L)));
39
40 // specify connection
41 String uri = "<connection-string>";
42
43 // establish connection and set namespace
44 try (MongoClient mongoClient = MongoClients.create(uri)) {
45 MongoDatabase database = mongoClient.getDatabase("sample_mflix");
46 MongoCollection<Document> collection = database.getCollection("movies");
47
48 // run query and print results
49 collection.aggregate(Arrays.asList(agg,
50 limit(5),
51 project(fields(excludeId(), include("title"), computed("score", new Document("$meta", "searchScore"))))))
52 .forEach(doc -> System.out.println(doc.toJson()));
53 }
54 }
55}
{"title": "Prancer", "score": 1.0}
{"title": "Prancer Returns", "score": 1.0}
{"title": "Prince", "score": 1.0}
{"title": "Prince Avalanche", "score": 1.0}
{"title": "Prince of Broadway", "score": 1.0}

Atlas Search 결과에는 PrancePrince로 시작하는 영화 제목이 있는 문서가 포함되어 있습니다. Atlas Search는 title 필드를 기준으로 문서를 오름차순으로 정렬하기 때문에 Prance 다음에 Prince가 있는 제목을 반환합니다.

이 코드 예시에서는 다음 작업을 수행합니다:

  • mongodb 패키지 및 종속성을 가져옵니다.

  • Atlas 클러스터에 대한 연결을 설정합니다.

  • AggregateFlow 인스턴스에서 쿼리와 일치하는 문서를 인쇄합니다.

1import com.mongodb.client.model.Aggregates.limit
2import com.mongodb.client.model.Aggregates.project
3import com.mongodb.client.model.Projections.*
4import com.mongodb.kotlin.client.coroutine.MongoClient
5import kotlinx.coroutines.runBlocking
6import org.bson.Document
7
8fun main() {
9 // establish connection and set namespace
10 val uri = "<connection-string>"
11 val mongoClient = MongoClient.create(uri)
12 val database = mongoClient.getDatabase("sample_mflix")
13 val collection = database.getCollection<Document>("movies")
14
15 runBlocking {
16 // define clause
17 val shouldClause = listOf(
18 Document("wildcard", Document("query", "Prance*")
19 .append("path", "title")
20 .append("allowAnalyzedField", true)),
21 Document("wildcard", Document("query", "Prince*")
22 .append("path", "title")
23 .append("allowAnalyzedField", true))
24 )
25
26 // define query
27 val agg = Document(
28 "\$search",
29 Document("index", "default")
30 .append(
31 "compound",
32 Document("should", shouldClause)
33 )
34 .append("sort", Document("title", 1L))
35 )
36
37 // run query and print results
38 val resultsFlow = collection.aggregate<Document>(
39 listOf(
40 agg,
41 limit(5),
42 project(fields(
43 excludeId(),
44 include("title"),
45 computed("score", Document("\$meta", "searchScore"))
46 ))
47 )
48 )
49 resultsFlow.collect { println(it) }
50 }
51 mongoClient.close()
52}
Document{{title=Prancer, score=1.0}}
Document{{title=Prancer Returns, score=1.0}}
Document{{title=Prince, score=1.0}}
Document{{title=Prince Avalanche, score=1.0}}
Document{{title=Prince of Broadway, score=1.0}}

Atlas Search 결과에는 PrancePrince로 시작하는 영화 제목이 있는 문서가 포함되어 있습니다. Atlas Search는 title 필드를 기준으로 문서를 오름차순으로 정렬하기 때문에 Prance 다음에 Prince가 있는 제목을 반환합니다.

이 코드 예시에서는 다음 작업을 수행합니다:

  • MongoDB의 Node.js 드라이버인 mongodb를 가져옵니다.

  • MongoClient 클래스의 인스턴스를 만들어 Atlas 클러스터에 대한 연결을 설정합니다.

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

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

    • $limit 단계는 출력을 5 결과로만 제한합니다.

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

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

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

  • 커서 위를 반복하여 쿼리와 일치하는 문서를 인쇄합니다.

1const { MongoClient } = require("mongodb");
2
3// Replace the uri string with your MongoDB deployments connection string.
4const uri =
5 "<connection-string>";
6
7const client = new MongoClient(uri);
8
9async function run() {
10 try {
11 await client.connect();
12
13 // set namespace
14 const database = client.db("sample_mflix");
15 const coll = database.collection("movies");
16
17 // define pipeline
18 const agg = [
19 {
20 '$search': {
21 'compound': {
22 'should': [
23 {
24 'wildcard': {
25 'query': [
26 'Prance*'
27 ],
28 'path': 'title',
29 'allowAnalyzedField': true
30 }
31 }, {
32 'wildcard': {
33 'query': [
34 'Prince*'
35 ],
36 'path': 'title',
37 'allowAnalyzedField': true
38 }
39 }
40 ]
41 },
42 'sort': { 'title': 1 }
43 }
44 }, {
45 '$limit': 5
46 }, {
47 '$project': {'_id': 0, 'title': 1, 'score': {'$meta': 'searchScore'}
48 }
49 }
50 ];
51
52 // run pipeline
53 const result = await coll.aggregate(agg);
54
55 // print results
56 await result.forEach((doc) => console.log(doc));
57
58 } finally {
59 await client.close();
60 }
61}
62run().catch(console.dir);
{ title: 'Prancer', score: 1 }
{ title: 'Prancer Returns', score: 1 }
{ title: 'Prince', score: 1 }
{ title: 'Prince Avalanche', score: 1 }
{ title: 'Prince of Broadway', score: 1 }

Atlas Search 결과에는 PrancePrince로 시작하는 영화 제목이 있는 문서가 포함되어 있습니다. Atlas Search는 title 필드를 기준으로 문서를 오름차순으로 정렬하기 때문에 Prance 다음에 Prince가 있는 제목을 반환합니다.

다음 코드 예제에서는:

  • pymongo, MongoDB의 Python 드라이버 및 dns 모듈을 가져옵니다. 이 모듈은 DNS 시드 리스트 연결 문자열을 사용하여 pymongoAtlas에 연결하는 데 필요합니다.

  • MongoClient 클래스의 인스턴스를 만들어 Atlas 클러스터에 대한 연결을 설정합니다.

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

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

    • $limit 단계는 출력을 5 결과로만 제한합니다.

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

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

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

  • 커서 위를 반복하여 쿼리와 일치하는 문서를 인쇄합니다.

1import pymongo
2
3# connect to your Atlas cluster
4client = pymongo.MongoClient('<connection-string>')
5
6# define pipeline
7pipeline = [
8 {'$search': {
9 'compound': {
10 'should': [{'wildcard': {'query': 'Prance*', 'path': 'title', 'allowAnalyzedField': True}},
11 {'wildcard': {'query': 'Prince*', 'path': 'title', 'allowAnalyzedField': True}}]
12 },
13 'sort': { 'title': 1 }}},
14 {'$limit': 5},
15 {'$project': {'_id': 0, 'title': 1, 'score': {'$meta': 'searchScore'}}}
16]
17
18# run pipeline
19result = client['sample_mflix']['movies'].aggregate(pipeline)
20
21# print results
22for i in result:
23 print(i)
{'title': 'Prancer', 'score': 1.0}
{'title': 'Prancer Returns', 'score': 1.0}
{'title': 'Prince', 'score': 1.0}
{'title': 'Prince Avalanche', 'score': 1.0}
{'title': 'Prince of Broadway', 'score': 1.0}

Atlas Search 결과에는 PrancePrince로 시작하는 영화 제목이 있는 문서가 포함되어 있습니다. Atlas Search는 title 필드를 기준으로 문서를 오름차순으로 정렬하기 때문에 Prance 다음에 Prince가 있는 제목을 반환합니다.

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

쿼리는 결과의 문서를 5 (으)로 제한하는 $limit 단계와 다음을 수행하는 $project 단계를 지정합니다.

  • 결과에 _id, titleawards 필드만 포함합니다.

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

[
{
"$search": {
"text": {
"path": "title",
"query": "train",
},
"sort": {
"title": 1
}
}
}
]
SCORE: 3.317898988723755 _id: "573a139cf29313caabcf662c"
plot: "A train filled with atomic devices threatens to destroy the city of De…"
genres: Array
runtime: 122
SCORE: 3.317898988723755 _id: "64de50ae2932de4dd3203061"
genres: Array
title: "atomic train"
awards: Object
SCORE: 2.228306293487549 _id: "573a13bbf29313caabd52ff4"
fullplot: "Long ago up North on the Island of Berk, the young Viking, Hiccup, wan…"
imdb: Object
year: 2010
SCORE: 2.228306293487549 _id: "64de50da2932de4dd3204393"
genres: Array
title: "how to train your dragon"
awards: Object
SCORE: 2.008449077606201 _id: "573a13ccf29313caabd83281"
plot: "When Hiccup and Toothless discover an ice cave that is home to hundred…"
genres: Array
runtime: 102
SCORE: 1.4400973320007324 _id: "573a13b1f29313caabd36490"
plot: "The life and times of Howard Zinn: the historian, activist, and author…"
genres: Array
runtime: 78
SCORE: 2.228306293487549 _id: "573a1394f29313caabce0fb4"
plot: "A marshal tries to bring the son of an old friend, an autocratic cattl…"
genres: Array
runtime: 95
SCORE: 2.8528976440429688 _id: "573a13c8f29313caabd78a6b"
plot: "A couple embarks on a journey home for Chinese new year along with 130…"
genres: Array
runtime: 85
SCORE: 2.502213716506958 _id: "573a13baf29313caabd50811"
plot: "Two thugs from the Perth suburb of Midland catch the last train to Fre…"
genres: Array
runtime: 89
SCORE: 2.502213716506958 _id: "573a13a7f29313caabd1b667"
fullplot: "A teacher and a gangster meet by chance in a small town pharmacy. As a…"
imdb: Object
year: 2002

결과에는 대소문자에 관계없이 정렬된 문서가 포함됩니다. 그러나 normalizernone 로 설정하면 Atlas Search는 다음과 같은 결과를 반환합니다.

SCORE: 3.317898988723755 _id: "573a139cf29313caabcf662c"
plot: "A train filled with atomic devices threatens to destroy the city of De…"
genres: Array
runtime: 122
SCORE: 2.2382168769836426 _id: "573a13bbf29313caabd52ff4"
fullplot: "Long ago up North on the Island of Berk, the young Viking, Hiccup, wan…"
imdb: object
year: 2010
SCORE: 2.008449077606201 _id: "573a13ccf29313caabd83281"
plot: "When Hiccup and Toothless discover an ice cave that is home to hundred…"
genres: Array
runtime: 102
SCORE: 1.4400973320007324 _id: "573a13b1f29313caabd36490"
plot: "The life and times of Howard Zinn: the historian, activist, and author…"
genres: Array
runtime: 78
SCORE: 2.8528976440429688 _id: "573a13c8f29313caabd78a6b"
plot: "A couple embarks on a journey home for Chinese new year along with 130…"
genres: Array
runtime: 85
SCORE: 2.228306293487549 _id: "573a1394f29313caabce0fb4"
plot: "A marshal tries to bring the son of an old friend, an autocratic cattl…"
genres: Array
runtime: 95
SCORE: 2.502213716506958 _id: "573a13baf29313caabd50811"
plot: "Two thugs from the Perth suburb of Midland catch the last train to Fre…"
genres: Array
runtime: 89
SCORE: 2.502213716506958 _id: "573a13a7f29313caabd1b667"
fullplot: "A teacher and a gangster meet by chance in a small town pharmacy. As a…"
imdb: Object
year: 2002
SCORE: 3.3326687812805176 _id: "573a139af29313caabcef573"
plot: "A vengeful New York transit cop decides to steal a trainload of subway…"
genres: Array
runtime: 110
SCORE: 3.3326687812805176 _id: "573a1398f29313caabceb8f2"
plot: "Three stories are connected by a Memphis hotel and the spirit of Elvis…"
genres: Array
runtime: 110

대소문자를 정규화하지 않고 결과를 정렬하려면 인덱스 정의에서 normalizer 옵션을 none(7 행)으로 설정하고, 인덱스 정의를 저장한 후 쿼리를 다시 실행합니다.

db.movies.aggregate(
{
"$search": {
"index": "default",
"text": {
"path": "title",
"query": "train",
},
"sort": {
"title": 1
}
}
},
{
"$limit": 5
},
{
"$project": {
"_id": 1,
"title": 1,
"awards": 1,
"score": { $meta: "searchScore" }
}
}
)
[
{
_id: ObjectId("573a139cf29313caabcf662c"),
title: 'Atomic Train',
awards: { wins: 1, nominations: 1, text: '1 win & 1 nomination.' },
score: 3.317898988723755
},
{
_id: ObjectId("64de50ae2932de4dd3203061"),
title: 'atomic train',
awards: { wins: 1, nominations: 1 },
score: 3.317898988723755
},
{
_id: ObjectId("573a13bbf29313caabd52ff4"),
title: 'How to Train Your Dragon',
awards: {
wins: 32,
nominations: 51,
text: 'Nominated for 2 Oscars. Another 30 wins & 51 nominations.'
},
score: 2.228306293487549
},
{
_id: ObjectId("64de50da2932de4dd3204393"),
title: 'how to train your dragon',
awards: { wins: 32, nominations: 51 },
score: 2.228306293487549
},
{
_id: ObjectId("573a13ccf29313caabd83281"),
title: 'How to Train Your Dragon 2',
awards: {
wins: 18,
nominations: 52,
text: 'Nominated for 1 Oscar. Another 17 wins & 52 nominations.'
},
score: 2.008449077606201
}
]

결과에는 대소문자에 관계없이 정렬된 문서가 포함됩니다. 그러나 normalizernone 로 설정하면 Atlas Search는 다음과 같은 결과를 반환합니다.

[
{
_id: ObjectId("573a139cf29313caabcf662c"),
title: 'Atomic Train',
awards: { wins: 1, nominations: 1, text: '1 win & 1 nomination.' },
score: 3.3326687812805176
},
{
_id: ObjectId("573a13bbf29313caabd52ff4"),
title: 'How to Train Your Dragon',
awards: {
wins: 32,
nominations: 51,
text: 'Nominated for 2 Oscars. Another 30 wins & 51 nominations.'
},
score: 2.2382168769836426
},
{
_id: ObjectId("573a13ccf29313caabd83281"),
title: 'How to Train Your Dragon 2',
awards: {
wins: 18,
nominations: 52,
text: 'Nominated for 1 Oscar. Another 17 wins & 52 nominations.'
},
score: 2.0173802375793457
},
{
_id: ObjectId("573a13b1f29313caabd36490"),
title: "Howard Zinn: You Can't Be Neutral on a Moving Train",
awards: { wins: 1, nominations: 0, text: '1 win.' },
score: 1.446497917175293
},
{
_id: ObjectId("573a13c8f29313caabd78a6b"),
title: 'Last Train Home',
awards: { wins: 14, nominations: 9, text: '14 wins & 9 nominations.' },
score: 2.8655927181243896
}
]

대소문자를 정규화하지 않고 결과를 정렬하려면 인덱스 정의에서 normalizer 옵션을 none(7 행)으로 설정하고, 인덱스 정의를 저장한 후 쿼리를 다시 실행합니다.

파이프라인 단계
쿼리

$search

{
"index": "default",
"text": {
"path": "title",
"query": "train",
},
"sort": {
"title": 1,
}
}

$limit

5

$project

{
"_id": 1,
"title": 1,
"awards": 1,
"score": { $meta: "searchScore" }
}

Auto Preview활성화한 경우 MongoDB Compass는 $project 파이프라인 단계 옆에 다음 문서를 표시합니다.

_id: ObjectId('573a139cf29313caabcf662c')
title: 'Atomic Train'
awards: Object
score: 3.317898988723755
_id: ObjectId("64de50ae2932de4dd3203061")
title: 'atomic train'
awards: Object
score: 3.317898988723755
_id: ObjectId('573a13bbf29313caabd52ff4')
title: 'How to Train Your Dragon'
awards: Object
score: 2.228306293487549
_id: ObjectId("64de50da2932de4dd3204393"),
title: 'how to train your dragon'
awards:
score: 2.228306293487549
_id: ObjectId('573a13ccf29313caabd83281')
title: 'How to Train Your Dragon 2'
awards: object
score: 2.0173802375793457

결과에는 대소문자에 관계없이 정렬된 문서가 포함됩니다. 그러나 normalizernone 로 설정하면 Atlas Search는 다음과 같은 결과를 반환합니다.

1using MongoDB.Bson;
2using MongoDB.Bson.Serialization.Attributes;
3using MongoDB.Bson.Serialization.Conventions;
4using MongoDB.Driver;
5using MongoDB.Driver.Search;
6
7public class CaseInsensitiveSort
8{
9 private const string MongoConnectionString = "<connection-string>";
10
11 public static void Main(string[] args)
12 {
13 // allow automapping of the camelCase database fields to our MovieDocument
14 var camelCaseConvention = new ConventionPack { new camelCaseConvention() };
15 ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true);
16
17 // connect to your Atlas cluster
18 var mongoClient = new MongoClient(MongoConnectionString);
19 var yourDatabase = mongoClient.GetDatabase("sample_mflix");
20 var moviesCollection = yourDatabase.GetCollection<MovieDocument>("movies");
21
22 // define options for search
23 var searchOptions = new SearchOptions<MovieDocument>() {
24 Sort = Builders<MovieDocument>.Sort.Ascending(movie => movie.Title),
25 IndexName = "default"
26 };
27
28 // define and run pipeline
29 var results = moviesCollection.Aggregate()
30 .Search(Builders<MovieDocument>.Search.Text(movie => movie.Title, "train"), searchOptions)
31 .Limit (5)
32 .Project<MovieDocument>(Builders<MovieDocument>.Projection
33 .Include(movie => movie.Id)
34 .Include(movie => movie.Title)
35 .Include(movie => movie.Awards)
36 .MetaSearchScore(movie => movie.Score))
37 .ToList();
38
39 // print results
40 foreach (var movie in results)
41 {
42 Console.WriteLine(movie.ToJson());
43 }
44 }
45}
46
47[BsonIgnoreExtraElements]
48public class MovieDocument
49{
50 [BsonIgnoreIfDefault]
51 public ObjectId Id { get; set; }
52 public string Title { get; set; }
53 public Award Awards { get; set; }
54 public double Score { get; set; }
55}
56
57[BsonIgnoreExtraElements]
58public class Award
59{
60 public int Wins { get; set; }
61 public int Nominations { get; set; }
62}
{ "_id" : ObjectId("573a139cf29313caabcf662c"), "title" : "Atomic Train", "awards" : { "wins" : 1, "nominations" : 1 }, "score" : 3.3035578727722168 }
{ "_id" : ObjectId("64de50ae2932de4dd3203061"), "title" : "atomic train", "awards" : { "wins" : 1, "nominations" : 1 }, "score" : 3.3035578727722168 }
{ "_id" : ObjectId("573a13bbf29313caabd52ff4"), "title" : "How to Train Your Dragon", "awards" : { "wins" : 32, "nominations" : 51 }, "score" : 2.2186923027038574 }
{ "_id" : ObjectId("64de50da2932de4dd3204393"), "title" : "how to train your dragon", "awards" : { "wins" : 32, "nominations" : 51 }, "score" : 2.2186923027038574 }
{ "_id" : ObjectId("573a13ccf29313caabd83281"), "title" : "How to Train Your Dragon 2", "awards" : { "wins" : 18, "nominations" : 52 }, "score" : 1.9997868537902832 }

결과에는 대소문자에 관계없이 정렬된 문서가 포함됩니다. 그러나 normalizernone 로 설정하면 Atlas Search는 다음과 같은 결과를 반환합니다.

{ "_id" : ObjectId("573a139cf29313caabcf662c"), "title" : "Atomic Train", "awards" : { "wins" : 1, "nominations" : 1 }, "score" : 3.3035225868225098 }
{ "_id" : ObjectId("573a13bbf29313caabd52ff4"), "title" : "How to Train Your Dragon", "awards" : { "wins" : 32, "nominations" : 51 }, "score" : 2.2186522483825684 }
{ "_id" : ObjectId("573a13ccf29313caabd83281"), "title" : "How to Train Your Dragon 2", "awards" : { "wins" : 18, "nominations" : 52 }, "score" : 1.9997482299804688 }
{ "_id" : ObjectId("573a13b1f29313caabd36490"), "title" : "Howard Zinn: You Can't Be Neutral on a Moving Train", "awards" : { "wins" : 1, "nominations" : 0 }, "score" : 1.4338588714599609 }
{ "_id" : ObjectId("573a13c8f29313caabd78a6b"), "title" : "Last Train Home", "awards" : { "wins" : 14, "nominations" : 9 }, "score" : 2.8405368328094482 }

대소문자를 정규화하지 않고 결과를 정렬하려면 인덱스 정의에서 normalizer 옵션을 none(7 행)으로 설정하고, 인덱스 정의를 저장한 후 쿼리를 다시 실행합니다.

1package main
2
3import (
4 "context"
5 "fmt"
6
7 "go.mongodb.org/mongo-driver/bson"
8 "go.mongodb.org/mongo-driver/mongo"
9 "go.mongodb.org/mongo-driver/mongo/options"
10)
11
12func main() {
13 // connect to your Atlas cluster
14 client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI("<connection-string>"))
15 if err != nil {
16 panic(err)
17 }
18 defer client.Disconnect(context.TODO())
19
20 // set namespace
21 collection := client.Database("sample_mflix").Collection("movies")
22
23 // define pipeline stages
24 searchStage := bson.D{{"$search", bson.M{
25 "index": "default",
26 "text": bson.D{
27 {"path", "title"},
28 {"query", "train"},
29 },
30 "sort": bson.D{{"title", 1}},
31 }}}
32 limitStage := bson.D{{"$limit", 5}}
33 projectStage := bson.D{{"$project", bson.D{{"_id", 1}, {"title", 1}, {"awards", 1}, {"score", bson.D{{"$meta", "searchScore"}}}}}}
34
35 // run pipeline
36 cursor, err := collection.Aggregate(context.TODO(), mongo.Pipeline{searchStage, limitStage, projectStage})
37 if err != nil {
38 panic(err)
39 }
40
41 // print results
42 var results []bson.D
43 if err = cursor.All(context.TODO(), &results); err != nil {
44 panic(err)
45 }
46 for _, result := range results {
47 fmt.Println(result)
48 }
49}
[{_id ObjectID("573a139cf29313caabcf662c")} {title Atomic Train} {awards [{wins 1} {nominations 1} {text 1 win & 1 nomination.}]} {score 3.317898988723755}]
[{_id ObjectId("64de50ae2932de4dd3203061")} {title atomic train} {awards [{wins 1} {nominations 1}]} {score 3.317898988723755}]
[{_id ObjectID("573a13bbf29313caabd52ff4")} {title How to Train Your Dragon} {awards [{wins 32} {nominations 51} {text Nominated for 2 Oscars. Another 30 wins & 51 nominations.}]} {score 2.228306293487549}]
[{_id ObjectId("64de50da2932de4dd3204393")} {title how to train your dragon} {awards [{wins 32} {nominations 51}]} {score 2.228306293487549}]
[{_id ObjectID("573a13ccf29313caabd83281")} {title How to Train Your Dragon 2} {awards [{wins 18} {nominations 52} {text Nominated for 1 Oscar. Another 17 wins & 52 nominations.}]} {score 2.008449077606201}]

결과에는 대소문자에 관계없이 정렬된 문서가 포함됩니다. 그러나 normalizernone 로 설정하면 Atlas Search는 다음과 같은 결과를 반환합니다.

[{_id ObjectID("573a139cf29313caabcf662c")} {title Atomic Train} {awards [{wins 1} {nominations 1} {text 1 win & 1 nomination.}]} {score 3.3326687812805176}]
[{_id ObjectID("573a13bbf29313caabd52ff4")} {title How to Train Your Dragon} {awards [{wins 32} {nominations 51} {text Nominated for 2 Oscars. Another 30 wins & 51 nominations.}]} {score 2.2382168769836426}]
[{_id ObjectID("573a13ccf29313caabd83281")} {title How to Train Your Dragon 2} {awards [{wins 18} {nominations 52} {text Nominated for 1 Oscar. Another 17 wins & 52 nominations.}]} {score 2.0173802375793457}]
[{_id ObjectID("573a13b1f29313caabd36490")} {title Howard Zinn: You Can't Be Neutral on a Moving Train} {awards [{wins 1} {nominations 0} {text 1 win.}]} {score 1.446497917175293}]
[{_id ObjectID("573a13c8f29313caabd78a6b")} {title Last Train Home} {awards [{wins 14} {nominations 9} {text 14 wins & 9 nominations.}]} {score 2.8655927181243896}]

대소문자를 정규화하지 않고 결과를 정렬하려면 인덱스 정의에서 normalizer 옵션을 none(7 행)으로 설정하고, 인덱스 정의를 저장한 후 쿼리를 다시 실행합니다.

1import java.util.Arrays;
2import static com.mongodb.client.model.Aggregates.limit;
3import static com.mongodb.client.model.Aggregates.project;
4import static com.mongodb.client.model.Projections.*;
5import com.mongodb.client.MongoClient;
6import com.mongodb.client.MongoClients;
7import com.mongodb.client.MongoCollection;
8import com.mongodb.client.MongoDatabase;
9import org.bson.Document;
10
11public class CaseInsensitiveQuery {
12 public static void main( String[] args ) {
13 // define query
14 Document agg =
15 new Document("$search",
16 new Document("index", "default")
17 .append("text",
18 new Document("path", "title")
19 .append("query", "train"))
20 .append("sort",
21 new Document("title", 1)));
22
23 // specify connection
24 String uri = "<connection-string>";
25
26 // establish connection and set namespace
27 try (MongoClient mongoClient = MongoClients.create(uri)) {
28 MongoDatabase database = mongoClient.getDatabase("sample_mflix");
29 MongoCollection<Document> collection = database.getCollection("movies");
30
31 // run query and print results
32 collection.aggregate(Arrays.asList(agg,
33 limit(5),
34 project(fields(include("_id"), include("title"), include("awards"), computed("score", new Document("$meta", "searchScore"))))))
35 .forEach(doc -> System.out.println(doc.toJson()));
36 }
37 }
38}
{"_id": {"$oid": "573a139cf29313caabcf662c"}, "title": "Atomic Train", "awards": {"wins": 1, "nominations": 1, "text": "1 win & 1 nomination."}, "score": 3.317898988723755}
{"_id": {"$oid": "64de50ae2932de4dd3203061"}, "title": "atomic train", "awards": {"wins": 1, "nominations": 1}, "score": 3.317898988723755}
{"_id": {"$oid": "573a13bbf29313caabd52ff4"}, "title": "How to Train Your Dragon", "awards": {"wins": 32, "nominations": 51, "text": "Nominated for 2 Oscars. Another 30 wins & 51 nominations."}, "score": 2.228306293487549}
{"_id": {"$oid": "64de50da2932de4dd3204393"}, "title": "how to train your dragon", "awards": {"wins": 32, "nominations": 51}, "score": 2.228306293487549}
{"_id": {"$oid": "573a13ccf29313caabd83281"}, "title": "How to Train Your Dragon 2", "awards": {"wins": 18, "nominations": 52, "text": "Nominated for 1 Oscar. Another 17 wins & 52 nominations."}, "score": 2.008449077606201}

결과에는 대소문자에 관계없이 정렬된 문서가 포함됩니다. 그러나 normalizernone 로 설정하면 Atlas Search는 다음과 같은 결과를 반환합니다.

{"_id": {"$oid": "573a139cf29313caabcf662c"}, "title": "Atomic Train", "awards": {"wins": 1, "nominations": 1, "text": "1 win & 1 nomination."}, "score": 3.3326687812805176}
{"_id": {"$oid": "573a13bbf29313caabd52ff4"}, "title": "How to Train Your Dragon", "awards": {"wins": 32, "nominations": 51, "text": "Nominated for 2 Oscars. Another 30 wins & 51 nominations."}, "score": 2.2382168769836426}
{"_id": {"$oid": "573a13ccf29313caabd83281"}, "title": "How to Train Your Dragon 2", "awards": {"wins": 18, "nominations": 52, "text": "Nominated for 1 Oscar. Another 17 wins & 52 nominations."}, "score": 2.0173802375793457}
{"_id": {"$oid": "573a13b1f29313caabd36490"}, "title": "Howard Zinn: You Can't Be Neutral on a Moving Train", "awards": {"wins": 1, "nominations": 0, "text": "1 win."}, "score": 1.446497917175293}
{"_id": {"$oid": "573a13c8f29313caabd78a6b"}, "title": "Last Train Home", "awards": {"wins": 14, "nominations": 9, "text": "14 wins & 9 nominations."}, "score": 2.8655927181243896}

대소문자를 정규화하지 않고 결과를 정렬하려면 인덱스 정의에서 normalizer 옵션을 none(7 행)으로 설정하고, 인덱스 정의를 저장한 후 쿼리를 다시 실행합니다.

1import com.mongodb.client.model.Aggregates.limit
2import com.mongodb.client.model.Aggregates.project
3import com.mongodb.client.model.Projections.*
4import com.mongodb.kotlin.client.coroutine.MongoClient
5import kotlinx.coroutines.runBlocking
6import org.bson.Document
7
8fun main() {
9 // establish connection and set namespace
10 val uri = "<connection-string>"
11 val mongoClient = MongoClient.create(uri)
12 val database = mongoClient.getDatabase("sample_mflix")
13 val collection = database.getCollection<Document>("movies")
14
15 runBlocking {
16 // define query
17 val agg = Document(
18 "\$search",
19 Document("index", "default")
20 .append(
21 "text",
22 Document("path", "title")
23 .append("query", "train")
24 )
25 .append(
26 "sort",
27 Document("title", 1)
28 )
29 )
30
31 // run query and print results
32 val resultsFlow = collection.aggregate<Document>(
33 listOf(
34 agg,
35 limit(5),
36 project(fields(
37 excludeId(),
38 include("title", "awards"),
39 computed("score", Document("\$meta", "searchScore"))
40 ))
41 )
42 )
43 resultsFlow.collect { println(it) }
44 }
45 mongoClient.close()
46}
Document{{title=atomic train, awards=Document{{wins=1, nominations=1}}, score=3.3326687812805176}}
Document{{title=Atomic Train, awards=Document{{wins=1, nominations=1, text=1 win & 1 nomination.}}, score=3.3326687812805176}}
Document{{title=how to train your dragon, awards=Document{{wins=32, nominations=51}}, score=2.2382168769836426}}
Document{{title=How to Train Your Dragon, awards=Document{{wins=32, nominations=51, text=Nominated for 2 Oscars. Another 30 wins & 51 nominations.}}, score=2.2382168769836426}}
Document{{title=How to Train Your Dragon 2, awards=Document{{wins=18, nominations=52, text=Nominated for 1 Oscar. Another 17 wins & 52 nominations.}}, score=2.0173802375793457}}

결과에는 대소문자에 관계없이 정렬된 문서가 포함됩니다. 그러나 normalizernone 로 설정하면 Atlas Search는 다음과 같은 결과를 반환합니다.

Document{{title=Atomic Train, awards=Document{{wins=1, nominations=1, text=1 win & 1 nomination.}}, score=3.3326687812805176}}
Document{{title=How to Train Your Dragon, awards=Document{{wins=32, nominations=51, text=Nominated for 2 Oscars. Another 30 wins & 51 nominations.}}, score=2.2382168769836426}}
Document{{title=How to Train Your Dragon 2, awards=Document{{wins=18, nominations=52, text=Nominated for 1 Oscar. Another 17 wins & 52 nominations.}}, score=2.0173802375793457}}
Document{{title=Howard Zinn: You Can't Be Neutral on a Moving Train, awards=Document{{wins=1, nominations=0, text=1 win.}}, score=1.446497917175293}}
Document{{title=Last Train Home, awards=Document{{wins=14, nominations=9, text=14 wins & 9 nominations.}}, score=2.8655927181243896}}

대소문자를 정규화하지 않고 결과를 정렬하려면 인덱스 정의에서 normalizer 옵션을 none(7 행)으로 설정하고, 인덱스 정의를 저장한 후 쿼리를 다시 실행합니다.

1const { MongoClient } = require("mongodb");
2
3// Replace the uri string with your MongoDB deployments connection string.
4const uri =
5 "<connection-string>";
6
7const client = new MongoClient(uri);
8
9async function run() {
10 try {
11 await client.connect();
12
13 // set namespace
14 const database = client.db("sample_mflix");
15 const coll = database.collection("movies");
16
17 // define pipeline
18 const agg = [
19 {
20 '$search': {
21 'index': 'default',
22 'text': { 'path': 'title', 'query': 'train' },
23 'sort': { 'title': 1 }
24 }
25 }, {
26 '$limit': 5
27 }, {
28 '$project': { '_id': 1, 'title': 1, 'awards': 1, 'score': { '$meta': 'searchScore' }}
29 }
30 ];
31
32 // run pipeline
33 const result = await coll.aggregate(agg);
34
35 // print results
36 await result.forEach((doc) => console.log(doc));
37
38 } finally {
39 await client.close();
40 }
41}
42run().catch(console.dir);
{
_id: new ObjectId("573a139cf29313caabcf662c"),
title: 'Atomic Train',
awards: { wins: 1, nominations: 1, text: '1 win & 1 nomination.' },
score: 3.317898988723755
}
{
_id: new ObjectId("64de50ae2932de4dd3203061"),
title: 'atomic train',
awards: { wins: 1, nominations: 1 },
score: 3.317898988723755
}
{
_id: new ObjectId("573a13bbf29313caabd52ff4"),
title: 'How to Train Your Dragon',
awards: {
wins: 32,
nominations: 51,
text: 'Nominated for 2 Oscars. Another 30 wins & 51 nominations.'
},
score: 2.228306293487549
}
{
_id: new ObjectId("64de50da2932de4dd3204393"),
title: 'how to train your dragon',
awards: { wins: 32, nominations: 51 },
score: 2.228306293487549
}
{
_id: new ObjectId("573a13ccf29313caabd83281"),
title: 'How to Train Your Dragon 2',
awards: {
wins: 18,
nominations: 52,
text: 'Nominated for 1 Oscar. Another 17 wins & 52 nominations.'
},
score: 2.008449077606201
}

결과에는 대소문자에 관계없이 정렬된 문서가 포함됩니다. 그러나 normalizernone 로 설정하면 Atlas Search는 다음과 같은 결과를 반환합니다.

{
_id: new ObjectId("573a139cf29313caabcf662c"),
title: 'Atomic Train',
awards: { wins: 1, nominations: 1, text: '1 win & 1 nomination.' },
score: 3.3326687812805176
}
{
_id: new ObjectId("573a13bbf29313caabd52ff4"),
title: 'How to Train Your Dragon',
awards: {
wins: 32,
nominations: 51,
text: 'Nominated for 2 Oscars. Another 30 wins & 51 nominations.'
},
score: 2.2382168769836426
}
{
_id: new ObjectId("573a13ccf29313caabd83281"),
title: 'How to Train Your Dragon 2',
awards: {
wins: 18,
nominations: 52,
text: 'Nominated for 1 Oscar. Another 17 wins & 52 nominations.'
},
score: 2.0173802375793457
}
{
_id: new ObjectId("573a13b1f29313caabd36490"),
title: "Howard Zinn: You Can't Be Neutral on a Moving Train",
awards: { wins: 1, nominations: 0, text: '1 win.' },
score: 1.446497917175293
}
{
_id: new ObjectId("573a13c8f29313caabd78a6b"),
title: 'Last Train Home',
awards: { wins: 14, nominations: 9, text: '14 wins & 9 nominations.' },
score: 2.8655927181243896
}

대소문자를 정규화하지 않고 결과를 정렬하려면 인덱스 정의에서 normalizer 옵션을 none(7 행)으로 설정하고, 인덱스 정의를 저장한 후 쿼리를 다시 실행합니다.

1import pymongo
2
3# connect to your Atlas cluster
4client = pymongo.MongoClient('<connection-string>')
5
6# define pipeline
7pipeline = [
8 {
9 '$search': {
10 'index': 'default',
11 'text': { 'path': 'title', 'query': 'train' },
12 'sort': { 'title': 1 }
13 }
14 }, {
15 '$limit': 5
16 }, {
17 '$project': { '_id': 1, 'title': 1, 'awards': 1, 'score': { '$meta': 'searchScore' } }
18 }
19]
20
21# run pipeline
22result = client['sample_mflix']['movies'].aggregate(pipeline)
23
24# print results
25for i in result:
26 print(i)
{'_id': ObjectId('573a139cf29313caabcf662c'), 'title': 'Atomic Train', 'awards': {'wins': 1, 'nominations': 1, 'text': '1 win & 1 nomination.'}, 'score': 3.317898988723755}
{'_id': ObjectId('64de50ae2932de4dd3203061'), 'title': 'atomic train', 'awards': {'wins': 1, 'nominations': 1}, 'score': 3.317898988723755}
{'_id': ObjectId('573a13bbf29313caabd52ff4'), 'title': 'How to Train Your Dragon', 'awards': {'wins': 32, 'nominations': 51, 'text': 'Nominated for 2 Oscars. Another 30 wins & 51 nominations.'}, 'score': 2.228306293487549}
{'_id': ObjectId('64de50da2932de4dd3204393'), 'title': 'how to train your dragon', 'awards': {'wins': 32, 'nominations': 51}, 'score': 2.228306293487549}
{'_id': ObjectId('573a13ccf29313caabd83281'), 'title': 'How to Train Your Dragon 2', 'awards': {'wins': 18, 'nominations': 52, 'text': 'Nominated for 1 Oscar. Another 17 wins & 52 nominations.'}, 'score': 2.008449077606201}

결과에는 대소문자에 관계없이 정렬된 문서가 포함됩니다. 그러나 normalizernone 로 설정하면 Atlas Search는 다음과 같은 결과를 반환합니다.

{'_id': ObjectId('573a139cf29313caabcf662c'), 'title': 'Atomic Train', 'awards': {'wins': 1, 'nominations': 1, 'text': '1 win & 1 nomination.'}, 'score': 3.3326687812805176}
{'_id': ObjectId('573a13bbf29313caabd52ff4'), 'title': 'How to Train Your Dragon', 'awards': {'wins': 32, 'nominations': 51, 'text': 'Nominated for 2 Oscars. Another 30 wins & 51 nominations.'}, 'score': 2.2382168769836426}
{'_id': ObjectId('573a13ccf29313caabd83281'), 'title': 'How to Train Your Dragon 2', 'awards': {'wins': 18, 'nominations': 52, 'text': 'Nominated for 1 Oscar. Another 17 wins & 52 nominations.'}, 'score': 2.0173802375793457}
{'_id': ObjectId('573a13b1f29313caabd36490'), 'title': "Howard Zinn: You Can't Be Neutral on a Moving Train", 'awards': {'wins': 1, 'nominations': 0, 'text': '1 win.'}, 'score': 1.446497917175293}
{'_id': ObjectId('573a13c8f29313caabd78a6b'), 'title': 'Last Train Home', 'awards': {'wins': 14, 'nominations': 9, 'text': '14 wins & 9 nominations.'}, 'score': 2.8655927181243896}

대소문자를 정규화하지 않고 결과를 정렬하려면 인덱스 정의에서 normalizer 옵션을 none(7 행)으로 설정하고, 인덱스 정의를 저장한 후 쿼리를 다시 실행합니다.

다음 쿼리는 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" }
}
}
])
[
{
_id: ObjectId('573a13fbf29313caabdedf31'),
title: 'No Home Movie',
released: ISODate('2015-08-10T00:00:00.000Z'),
score: 1
},
{
_id: ObjectId('573a13fbf29313caabdedf30'),
title: 'Our Loved Ones',
released: ISODate('2015-08-12T00:00:00.000Z'),
score: 1
},
{
_id: ObjectId('573a13faf29313caabded406'),
title: 'The Red Spider',
released: ISODate('2015-11-20T00:00:00.000Z'),
score: 1
},
{
_id: ObjectId('573a13faf29313caabded1d6'),
title: 'The Laundryman',
released: ISODate('2015-07-11T00:00:00.000Z'),
score: 1
},
{
_id: ObjectId('573a13faf29313caabdecaf3'),
title: 'Right Now, Wrong Then',
released: ISODate('2015-09-01T00:00:00.000Z'),
score: 1
}
]

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

db.users.aggregate([
{
"$search": {
"text": {
"path": "b",
"query": "hello"
},
"sort": {
"a": 1
}
}
},
{
"$project": {
"_id": 1,
"a": 1,
"score": { "$meta": "searchScore" }
}
}
])
[
{ _id: 3, score: 0.029335692524909973 },
{
_id: 0,
a: UUID('1a324de2-e34b-c87e-f2a1-42ce37ad74ed'),
score: 0.029335692524909973
},
{
_id: 1,
a: UUID('3b241101-e2bb-4255-8caf-4136c566a962'),
score: 0.029335692524909973
},
{
_id: 6,
a: UUID('7eeddf21-b313-4a5c-81c2-c68915daa618'),
score: 0.029335692524909973
},
{
_id: 4,
a: UUID('d3c12e1c-c36e-25ed-7c3e-1e7f1e53c752'),
score: 0.029335692524909973
},
{
_id: 5,
a: UUID('d73f181e-cdda-42b4-b844-4d6e172e9bc8'),
score: 0.029335692524909973
},
{
_id: 2,
a: UUID('dee11d4e-63c6-4d90-983c-5c9f1e79e96c'),
score: 0.029335692524909973
}
]

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

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

Atlas Search 오름차순 정렬 중에 다음 예시 와 같이 기본값 으로 null 또는 누락된 값이 있는 문서를 결과 상단에 반환합니다.

db.users.aggregate([
{
"$search": {
"text": {
"path": "b",
"query": "hello"
},
"sort": { "c": 1 }
}
},
{
"$project": {
"_id": 1,
"c": 1,
"score": { "$meta": "searchScore" }
}
}
])
[
{ _id: 4, c: null, score: 0.029335692524909973 },
{ _id: 5, c: [], score: 0.029335692524909973 },
{ _id: 6, score: 0.029335692524909973 },
{ _id: 2, c: 'foo', score: 0.029335692524909973 },
{
_id: 3,
c: UUID('3be11d4e-62cb-4e95-9a3c-5c9f1e56c732'),
score: 0.029335692524909973
},
{
_id: 0,
c: ObjectId('507f1f77bcf86cd799439011'),
score: 0.029335692524909973
},
{ _id: 1, c: true, score: 0.029335692524909973 }
]

내림차순 정렬 중에 Atlas Search 다음 예시 와 같이 기본값 으로 null 또는 누락된 값이 있는 문서를 결과 하단에 반환합니다.

db.users.aggregate([
{
"$search": {
"text": {
"path": "b",
"query": "hello"
},
"sort": { "c": -1 }
}
},
{
"$project": {
"_id": 1,
"c": 1,
"score": { "$meta": "searchScore" }
}
}
])
[
{ _id: 1, c: true, score: 0.025981096550822258 },
{
_id: 0,
c: ObjectId('507f1f77bcf86cd799439011'),
score: 0.025981096550822258
},
{
_id: 3,
c: UUID('3be11d4e-62cb-4e95-9a3c-5c9f1e56c732'),
score: 0.025981096550822258
},
{ _id: 2, c: 'foo', score: 0.025981096550822258 },
{ _id: 4, c: null, score: 0.025981096550822258 },
{ _id: 5, c: [], score: 0.025981096550822258 },
{ _id: 6, score: 0.025981096550822258 }
]

참고

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

오름차순 정렬 중에 noData 필드 lowest 로 지정하면 Atlas Search 다음 예시 와 같이 결과 상단에 null 또는 누락된 값이 있는 문서를 반환합니다.

db.users.aggregate([
{
"$search": {
"text": {
"path": "b",
"query": "hello"
},
"sort": {
"c": {
"order": 1,
"noData": "lowest"
}
}
}
},
{
"$project": {
"_id": 1,
"c": 1,
"score": { "$meta": "searchScore" }
}
}
])
[
{ _id: 4, c: null, score: 0.029335692524909973 },
{ _id: 5, c: [], score: 0.029335692524909973 },
{ _id: 6, score: 0.029335692524909973 },
{ _id: 2, c: 'foo', score: 0.029335692524909973 },
{
_id: 3,
c: UUID('3be11d4e-62cb-4e95-9a3c-5c9f1e56c732'),
score: 0.029335692524909973
},
{
_id: 0,
c: ObjectId('507f1f77bcf86cd799439011'),
score: 0.029335692524909973
},
{ _id: 1, c: true, score: 0.029335692524909973 }
]

내림차순 정렬 중에 noData 필드 lowest 로 지정하면 Atlas Search 다음 예시 와 같이 결과 하단에 null 또는 누락된 값이 있는 문서를 반환합니다.

db.users.aggregate([
{
"$search": {
"text": {
"path": "b",
"query": "hello"
},
"sort": {
"c": {
"order": -1,
"noData": "lowest"
}
}
}
},
{
"$project": {
"_id": 1,
"c": 1,
"score": { "$meta": "searchScore" }
}
}
])
[
{ _id: 1, c: true, score: 0.025981096550822258 },
{
_id: 0,
c: ObjectId('507f1f77bcf86cd799439011'),
score: 0.025981096550822258
},
{
_id: 3,
c: UUID('3be11d4e-62cb-4e95-9a3c-5c9f1e56c732'),
score: 0.025981096550822258
},
{ _id: 2, c: 'foo', score: 0.025981096550822258 },
{ _id: 4, c: null, score: 0.025981096550822258 },
{ _id: 5, c: [], score: 0.025981096550822258 },
{ _id: 6, score: 0.025981096550822258 }
]

오름차순 정렬 중에 noData 필드 highest 로 지정하면 Atlas Search 다음 예시 와 같이 결과 하단에 null 또는 누락된 값이 있는 문서를 반환합니다.

db.users.aggregate([
{
"$search": {
"text": {
"path": "b",
"query": "hello"
},
"sort": {
"c": {
"order": 1,
"noData": "highest"
}
}
}
},
{
"$project": {
"_id": 1,
"c": 1,
"score": { "$meta": "searchScore" }
}
}
])
[
{ _id: 2, c: 'foo', score: 0.025981096550822258 },
{
_id: 3,
c: UUID('3be11d4e-62cb-4e95-9a3c-5c9f1e56c732'),
score: 0.025981096550822258
},
{
_id: 0,
c: ObjectId('507f1f77bcf86cd799439011'),
score: 0.025981096550822258
},
{ _id: 1, c: true, score: 0.025981096550822258 },
{ _id: 4, c: null, score: 0.025981096550822258 },
{ _id: 5, c: [], score: 0.025981096550822258 },
{ _id: 6, score: 0.025981096550822258 }
]

내림차순 정렬 중에 noData 필드 highest 로 지정하면 Atlas Search 다음 예시 와 같이 결과 상단에 null 또는 누락된 값이 있는 문서를 반환합니다.

db.users.aggregate([
{
"$search": {
"text": {
"path": "b",
"query": "hello"
},
"sort": {
"c": {
"order": -1,
"noData": "highest"
}
}
}
},
{
"$project": {
"_id": 1,
"c": 1,
"score": { "$meta": "searchScore" }
}
}
])
[
{ _id: 4, c: null, score: 0.025981096550822258 },
{ _id: 5, c: [], score: 0.025981096550822258 },
{ _id: 6, score: 0.025981096550822258 },
{ _id: 1, c: true, score: 0.025981096550822258 },
{
_id: 0,
c: ObjectId('507f1f77bcf86cd799439011'),
score: 0.025981096550822258
},
{
_id: 3,
c: UUID('3be11d4e-62cb-4e95-9a3c-5c9f1e56c732'),
score: 0.025981096550822258
},
{ _id: 2, c: 'foo', score: 0.025981096550822258 }
]

Atlas Search 정렬 시 null 값과 누락된 값을 동일하게 취급하므로 "_id": 4, "_id": 5, "_id": 6 가 있는 문서의 순서는 무작위입니다.

필드 에 다중 유형 배열 있는 추가 문서 있는 경우 사용자 컬렉션 에 대한 다음 쿼리를 가정해 c 보겠습니다.

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

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

참고

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

오름차순 정렬의 경우 Atlas Search BSON 유형이 가장 낮은 요소를 사용하여 다중 유형 배열 나타냅니다. 기본값 으로 Atlas Search null 또는 누락된 값을 가장 낮은 BSON 값으로 간주합니다. 따라서 Atlas Search null 를 사용하여 문서 의 다중 유형 배열 _id: 7 으로 나타내고, 이 문서 다른 null 및 누락된 값과 함께 결과 상단에 반환합니다.

자세히 학습 Null 및 누락된 값으로 정렬여러 유형으로 배열 정렬을 참조하세요.

db.users.aggregate([
{
"$search": {
"text": {
"path": "b",
"query": "hello"
},
"sort": {
"c": 1
}
}
},
{
"$project": {
"_id": 1,
"c": 1,
"score": { "$meta": "searchScore" }
}
}
])
[
{ _id: 4, c: null, score: 0.025981096550822258 },
{ _id: 5, c: [], score: 0.025981096550822258 },
{ _id: 6, score: 0.025981096550822258 }
{ _id: 7, c: [ false, null, 15 ], score: 0.025981096550822258 },
{ _id: 2, c: 'foo', score: 0.025981096550822258 },
{
_id: 3,
c: UUID('3be11d4e-62cb-4e95-9a3c-5c9f1e56c732'),
score: 0.025981096550822258
},
{
_id: 0,
c: ObjectId('507f1f77bcf86cd799439011'),
score: 0.025981096550822258
},
{ _id: 1, c: true, score: 0.025981096550822258 }
]

Atlas Search 정렬 시 null 값과 누락된 값을 동일하게 취급하기 때문에 "_id": 4, "_id": 5, "_id": 6, "_id": 7 이 있는 문서의 순서는 무작위입니다.

내림차순 정렬의 경우 Atlas Search BSON 유형이 가장 높은 요소를 사용하여 다중 유형 배열 나타냅니다. Atlas Search 배열 에서 가장 높은 BSON types이기 때문에 이 false 있는 문서 _id: 7 에 대한 다중 유형 배열 나타내는 데 를 사용합니다. Atlas Search Atlas Search true 값의 순위를 false 값보다 높기 때문에 _id: 1이 있는 문서 다음에 이 문서 반환합니다.

자세히 학습 Null 및 누락된 값으로 정렬여러 유형으로 배열 정렬을 참조하세요.

db.users.aggregate([
{
"$search": {
"text": {
"path": "b",
"query": "hello"
},
"sort": {
"c": -1
}
}
},
{
"$project": {
"_id": 1,
"c": 1,
"score": { "$meta": "searchScore" }
}
}
])
[
{ _id: 1, c: true, score: 0.025981096550822258 },
{ _id: 7, c: [ false, null, 15 ], score: 0.025981096550822258 },
{
_id: 0,
c: ObjectId('507f1f77bcf86cd799439011'),
score: 0.025981096550822258
},
{
_id: 3,
c: UUID('3be11d4e-62cb-4e95-9a3c-5c9f1e56c732'),
score: 0.025981096550822258
},
{ _id: 2, c: 'foo', score: 0.025981096550822258 }
{ _id: 4, c: null, score: 0.025981096550822258 },
{ _id: 5, c: [], score: 0.025981096550822258 },
{ _id: 6, score: 0.025981096550822258 },
]

Atlas Search 정렬 시 null 값과 누락된 값을 동일하게 취급하므로 "_id": 4, "_id": 5, "_id": 6 가 있는 문서의 순서는 무작위입니다.

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

오름차순 정렬의 경우 Atlas Search BSON 유형이 가장 낮은 요소를 사용하여 다중 유형 배열 나타냅니다. 쿼리 noData: highest null 또는 누락된 값을 가장 높은 BSON 값으로 간주하도록 15 를 지정하므로,_id: 7 숫자가 배열 에서 다음으로 낮은 BSON 유형이므로 Atlas Search 를 사용하여 문서 의 다중 유형 배열 으로 표현합니다. .

자세히 학습 Null 및 누락된 값으로 정렬여러 유형으로 배열 정렬을 참조하세요.

db.users.aggregate([
{
"$search": {
"text": {
"path": "b",
"query": "hello"
},
"sort": {
"c": {
"order": 1,
"noData": "highest"
}
}
}
},
{
"$project": {
"_id": 1,
"c": 1,
"score": { "$meta": "searchScore" }
}
}
])
[
{ _id: 7, c: [ false, null, 15 ], score: 0.025981096550822258 },
{ _id: 2, c: 'foo', score: 0.025981096550822258 },
{
_id: 3,
c: UUID('3be11d4e-62cb-4e95-9a3c-5c9f1e56c732'),
score: 0.025981096550822258
},
{
_id: 0,
c: ObjectId('507f1f77bcf86cd799439011'),
score: 0.025981096550822258
},
{ _id: 1, c: true, score: 0.025981096550822258 },
{ _id: 4, c: null, score: 0.025981096550822258 },
{ _id: 5, c: [], score: 0.025981096550822258 },
{ _id: 6, score: 0.025981096550822258 }
]

Atlas Search 정렬 시 null 값과 누락된 값을 동일하게 취급하므로 "_id": 4, "_id": 5, "_id": 6 가 있는 문서의 순서는 무작위입니다.

내림차순 정렬의 경우 Atlas Search BSON 유형이 가장 높은 요소를 사용하여 다중 유형 배열 나타냅니다. 쿼리 null 또는 누락된 값을 가장 높은 BSON noData 값으로 설정하다 하기 highest 위해 필드 으로 지정하므로, Atlas Search 를 사용하여 null 로 문서 의 다중 유형 배열 _id: 7 나타내고 이 문서 다음 위치에서 반환합니다. 다른 null 및 누락된 값과 함께 결과의 맨 위에 표시됩니다.

자세히 학습 Null 및 누락된 값으로 정렬여러 유형으로 배열 정렬을 참조하세요.

db.users.aggregate([
{
"$search": {
"text": {
"path": "b",
"query": "hello"
},
"sort": {
"c": {
"order": -1,
"noData": "highest"
}
}
}
},
{
"$project": {
"_id": 1,
"c": 1,
"score": { "$meta": "searchScore" }
}
}
])
[
{ _id: 4, c: null, score: 0.025981096550822258 },
{ _id: 5, c: [], score: 0.025981096550822258 },
{ _id: 6, score: 0.025981096550822258 },
{ _id: 7, c: [ false, null, 15 ], score: 0.025981096550822258 },
{ _id: 1, c: true, score: 0.025981096550822258 },
{
_id: 0,
c: ObjectId('507f1f77bcf86cd799439011'),
score: 0.025981096550822258
},
{
_id: 3,
c: UUID('3be11d4e-62cb-4e95-9a3c-5c9f1e56c732'),
score: 0.025981096550822258
},
{ _id: 2, c: 'foo', score: 0.025981096550822258 }
]

Atlas Search 정렬 시 null 값과 누락된 값을 동일하게 취급하기 때문에 "_id": 4, "_id": 5, "_id": 6, "_id": 7 이 있는 문서의 순서는 무작위입니다.

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

이 쿼리는 $limit 단계를 사용하여 출력을 5개 문서로 제한합니다. 또한 $project 단계를 사용하여 결과에서 name, property_type, address.country, address.location.is_location_exact를 제외한 모든 필드를 생략합니다.

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])
1[
2 {
3 name: 'BBC OPORTO 4X2',
4 property_type: 'Apartment',
5 address: { country: 'Portugal', location: { is_location_exact: true } }
6 },
7 {
8 name: 'Heroísmo IV',
9 property_type: 'Apartment',
10 address: { country: 'Portugal', location: { is_location_exact: true } }
11 },
12 {
13 name: 'Spacious and well located apartment',
14 property_type: 'Apartment',
15 address: { country: 'Portugal', location: { is_location_exact: true } }
16 },
17 {
18 name: 'Renovated Classic Design Studio with Sun Room',
19 property_type: 'Apartment',
20 address: { country: 'Portugal', location: { is_location_exact: true } }
21 },
22 {
23 name: "O'Porto Studio | Historic Center",
24 property_type: 'Loft',
25 address: { country: 'Portugal', location: { is_location_exact: true } }
26 }
27]

위 결과에서 문서의 is_location_exact 값은 true입니다. 내림차순으로 정렬하면 Atlas Search는 true 값을 false 값보다 높은 순위에 두기 때문입니다. 이전 쿼리의 9 행 값을 1로 변경하여 오름차순 정렬을 수행하면 Atlas 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일 이후에 개봉한 영화가 우선적으로 검색됩니다.

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

이 쿼리는 $limit 단계를 사용하여 출력을 10 문서로 제한합니다. 또한 $project 단계를 사용하여 다음을 수행합니다.

  • 결과에서 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" }
}
}
])
[
{
title: 'Shall We Dance?',
released: ISODate("1997-07-11T00:00:00.000Z"),
awards: { wins: 57 },
score: 4.9811458587646484
},
{
title: 'Shall We Dance?',
released: ISODate("1997-07-11T00:00:00.000Z"),
awards: { wins: 57 },
score: 4.9811458587646484
},
{
title: 'War Dance',
released: ISODate("2008-11-01T00:00:00.000Z"),
awards: { wins: 11 },
score: 5.466421127319336
},
{
title: 'Dance with the Devil',
released: ISODate("1997-10-31T00:00:00.000Z"),
awards: { wins: 6 },
score: 4.615056037902832
},
{
title: 'Save the Last Dance',
released: ISODate("2001-01-12T00:00:00.000Z"),
awards: { wins: 6 },
score: 4.615056037902832
},
{
title: 'Dance with a Stranger',
released: ISODate("1985-08-09T00:00:00.000Z"),
awards: { wins: 4 },
score: 3.615056037902832
},
{
title: 'The Baby Dance',
released: ISODate("1998-08-23T00:00:00.000Z"),
awards: { wins: 4 },
score: 4.981145858764648
},
{
title: 'Three-Step Dance',
released: ISODate("2004-02-19T00:00:00.000Z"),
awards: { wins: 4 },
score: 4.981145858764648
},
{
title: "Cats Don't Dance",
released: ISODate("1997-03-26T00:00:00.000Z"),
awards: { wins: 3 },
score: 4.981145858764648
},
{
title: 'Dance Me Outside',
released: ISODate("1995-03-10T00:00:00.000Z"),
awards: { wins: 3 },
score: 4.981145858764648
}
]

다음 쿼리는 $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 옵션을 사용하여 출시 날짜의 내림차순으로 결과를 정렬합니다.

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

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

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

$project 단계를 사용하여 awards.wins, releasedtitle 필드를 제외한 모든 필드를 생략합니다.

또한 $replaceWith 단계를 사용하여 $$SEARCH_META 변수에 저장된 메타데이터 결과를 meta 출력 필드에 포함하고 $set 단계를 사용하여 meta 필드를 결과에 추가합니다.

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]
}
}
}
])
[
{
docs: [
{
title: 'Cold in July',
released: ISODate("2014-12-31T00:00:00.000Z"),
awards: { wins: 1 }
},
{
title: 'The Gambler',
released: ISODate("2014-12-31T00:00:00.000Z"),
awards: { wins: 7 }
},
{
title: 'Force Majeure',
released: ISODate("2014-12-30T00:00:00.000Z"),
awards: { wins: 31 }
},
{
title: 'LFO',
released: ISODate("2014-12-27T00:00:00.000Z"),
awards: { wins: 3 }
},
{
title: 'Peace After Marriage',
released: ISODate('2014-12-26T00:00:00.000Z'),
awards: { wins: 5 }
}
],
meta: {
count: { lowerBound: Long("4821") },
facet: {
releasedFacet: {
buckets: [
{
_id: ISODate("2010-01-01T00:00:00.000Z"),
count: Long("857")
},
{
_id: ISODate("2011-01-01T00:00:00.000Z"),
count: Long("909")
},
{
_id: ISODate("2012-01-01T00:00:00.000Z"),
count: Long("903")
},
{
_id: ISODate("2013-01-01T00:00:00.000Z"),
count: Long("1063")
},
{
_id: ISODate("2014-01-01T00:00:00.000Z"),
count: Long("1089")
}
]
},
awardsFacet: {
buckets: [
{ _id: 1, count: Long("2330") },
{ _id: 5, count: Long("604") },
{ _id: 10, count: Long("233") }
]
}
}
}
}
}
]

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

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

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

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

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

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

  • 점수별로 결과를 오름차순으로 정렬합니다.

이 쿼리는 $limit 단계를 사용하여 출력을 5 문서로 제한합니다. 또한 $project 단계를 사용하여 다음 작업을 수행합니다.

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

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

db.movies.aggregate([
{
"$search": {
"text": {
"path": "title",
"query": "story"
},
"sort": {score: {$meta: "searchScore", order: 1}}
}
},
{
"$limit": 5
},
{
"$project": {
"_id": 0,
"title": 1,
"score": {$meta: "searchScore"}
}
}
])
[
{
title: 'Do You Believe in Miracles? The Story of the 1980 U.S. Hockey Team',
score: 0.8674521446228027
},
{
title: 'Once in a Lifetime: The Extraordinary Story of the New York Cosmos',
score: 0.9212141036987305
},
{
title: 'The Source: The Story of the Beats and the Beat Generation',
score: 0.9820802211761475
},
{
title: 'If These Knishes Could Talk: The Story of the NY Accent',
score: 0.9820802211761475
},
{
title: 'Dream Deceivers: The Story Behind James Vance vs. Judas Priest',
score: 1.051558256149292
}
]

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

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

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

이 쿼리는 $limit 단계를 사용하여 출력을 5 문서로 제한합니다. 또한 $project 단계를 사용하여 다음 작업을 수행합니다.

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

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

db.movies.aggregate([
{
"$search": {
"text": {
"path": "title",
"query": "summer"
},
"sort": {score: {$meta: "searchScore"}}
}
},
{
"$limit": 5
},
{
"$project": {
"_id": 1,
"title": 1,
"score": {$meta: "searchScore"}
}
}
])
[
{
_id: ObjectId("573a1398f29313caabcea21e"),
title: 'Summer',
score: 3.5844719409942627
},
{
_id: ObjectId("573a13a6f29313caabd18eca"),
title: 'Summer Things',
score: 3.000213623046875
},
{
_id: ObjectId("573a13b8f29313caabd4c1d0"),
title: 'Summer Palace',
score: 3.000213623046875
},
{
_id: ObjectId("573a1394f29313caabcde8e8"),
title: 'Summer Stock',
score: 3.000213623046875
},
{
_id: ObjectId("573a13acf29313caabd284fa"),
title: 'Wolf Summer',
score: 3.000213623046875
}
]

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

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

  • 먼저 점수를 기준으로 결과를 정렬한 다음, 점수가 동일한 결과에 대해 released 필드의 값을 기준으로 오름차순으로 정렬합니다.

이 쿼리는 $limit 단계를 사용하여 출력을 5 문서로 제한합니다. 또한 $project 단계를 사용하여 다음 작업을 수행합니다.

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

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

db.movies.aggregate([
{
"$search": {
"text": {
"path": "title",
"query": "prince"
},
"sort": {score: {$meta: "searchScore"}, "released": 1}
}
},
{
"$limit": 5
},
{
"$project": {
"_id": 0,
"title": 1,
"released": 1,
"score": {$meta: "searchScore"}
}
}
])
[
{
title: 'Prince',
released: ISODate("2015-08-14T00:00:00.000Z"),
score: 4.168826103210449
},
{
title: 'Prince Avalanche',
released: ISODate("2013-09-19T00:00:00.000Z"),
score: 3.4893198013305664
},
{
title: 'The Prince',
released: ISODate("2014-08-22T00:00:00.000Z"),
score: 3.4893198013305664
},
{
title: 'Prince of Foxes',
released: ISODate("1949-12-23T00:00:00.000Z"),
score: 3.0002830028533936
},
{
title: 'The Oil Prince',
released: ISODate("1966-01-01T00:00:00.000Z"),
score: 3.0002830028533936
}
]

돌아가기

점수 상세 정보

이 페이지의 내용

OSZAR »