정의
구문
range 의 구문은 다음과 같습니다:
1 { 2 "$search": { 3 "index": <index name>, // optional, defaults to "default" 4 "range": { 5 "path": "<field-to-search>", 6 "gt | gte": <value-to-search>, 7 "lt | lte": <value-to-search>, 8 "score": <score-options>, 9 "doesNotAffect": "<facet-to-exclude>" | [<array-of-facets>] 10 } 11 } 12 }
옵션
range 는 다음 용어를 사용하여 쿼리를 구성합니다:
필드 | 유형 | 설명 | 필요성 |
|---|---|---|---|
| BSON 날짜, 숫자, 문자열 또는 objectId | no | |
| BSON 날짜, 숫자, 문자열 또는 objectId | no | |
| 문자열 또는 문자열 배열 | 인덱싱된 필드 또는 검색할 필드. | 네 |
| 객체 | 일치하는 검색 결과에 할당된 점수를 수정합니다. 다음 옵션을 사용하여 기본 점수를 수정할 수 있습니다.
배열 값을 쿼리할 때 MongoDB Search는 배열 에서 쿼리 와 일치하는 값이 더 많을수록 더 높은 점수를 할당합니다. 쿼리에서 | no |
| 문자열 또는 문자열 배열 | 이 쿼리 기반으로 카운트 재계산에서 제외할 패싯 또는 패싯 목록입니다. 값은 | no |
예시
The following examples use the collection in the sample data. If you loaded the sample data on your cluster, you can create the indexes using the index definitions in the examples below and run the example queries on your cluster.
번호 예시
The following examples use indexes on numeric fields in the sample data and run range queries against the indexed fields.
이 예에서는 정적 또는 동적 매핑을 사용하여 sample_mflix.movies collection의 runtime 필드에 대한 인덱스를 생성할 수 있습니다. 이 쿼리는 gte 및 lte 필드를 사용하여 검색할 숫자 범위를 정의합니다.
샘플 인덱스
default라고 명명된 다음 인덱스 정의는 movies 컬렉션의 모든 필드를 인덱싱합니다.
1 { 2 "mappings": { 3 "dynamic": true 4 } 5 }
default(이)라고 명명된 다음 인덱스 정의는 movies 컬렉션에서만 runtime 필드의 인덱스를 생성합니다.
1 { 2 "mappings": { 3 "dynamic": false, 4 "fields": { 5 "runtime": { 6 "type": "number" 7 } 8 } 9 } 10 }
샘플 쿼리
다음 쿼리는 런타임이 2보다 크거나 같고 3보다 작거나 같은 영화를 검색합니다. 쿼리는 출력 결과를 5개로 제한하기 위해 $limit 단계를 포함하고, title과 runtime를 제외한 모든 필드를 제외하기 위해 $project 단계를 포함합니다.
1 db.movies.aggregate([ 2 { 3 "$search": { 4 "range": { 5 "path": "runtime", 6 "gte": 2, 7 "lte": 3 8 } 9 } 10 }, 11 { 12 "$limit": 5 13 }, 14 { 15 "$project": { 16 "_id": 0, 17 "title": 1, 18 "runtime": 1 19 } 20 } 21 ])
{ "runtime" : 3, "title" : "Dots" } { "runtime" : 3, "title" : "Sisyphus" } { "runtime" : 3, "title" : "The Fly" } { "runtime" : 2, "title" : "Andrè and Wally B." } { "runtime" : 2, "title" : "Luxo Jr." }
이 예에서는 정적 또는 동적 매핑을 사용하여 sample_mflix.movies 컬렉션의 runtime 필드를 인덱싱할 수 있습니다. 쿼리는 lte 필드를 사용하여 지정된 값보다 작거나 같은 모든 값을 검색합니다.
샘플 인덱스
default 이라는 이름의 다음 인덱스 정의는 movies 컬렉션의 runtime 필드를 인덱싱합니다.
1 { 2 "mappings": { 3 "dynamic": true 4 } 5 }
1 { 2 "mappings": { 3 "dynamic": false, 4 "fields": { 5 "runtime": { 6 "type": "number" 7 } 8 } 9 } 10 }
샘플 쿼리
다음 쿼리는 런타임이 2 이하인 모든 영화를 검색합니다. 여기에는 출력을 5 결과로 제한하는 $limit 단계와 $project 단계가 포함되어 있습니다.
title및runtime을 제외한 모든 필드를 제외합니다.다음과 같은 이름의 필드를 추가합니다.
score
1 db.movies.aggregate([ 2 { 3 "$search": { 4 "range": { 5 "path": "runtime", 6 "lte": 2 7 } 8 } 9 }, 10 { 11 "$limit": 5 12 }, 13 { 14 "$project": { 15 "_id": 0, 16 "title": 1, 17 "runtime": 1, 18 score: { $meta: "searchScore" } 19 } 20 } 21 ])
{ "runtime" : 1, "title" : "Blacksmith Scene", "score" : 1 } { "runtime" : 2, "title" : "Andrè and Wally B.", "score" : 1 } { "runtime" : 2, "title" : "Luxo Jr.", "score" : 1 } { "runtime" : 1, "title" : "The Kiss", "score" : 1 } { "runtime" : 1, "title" : "Dickson Experimental Sound Film", "score" : 1 }
다음 예제에서는 sample_analytics.customers 컬렉션에서 숫자 값 배열이 있는 필드를 포함하여 동적으로 인덱싱할 수 있는 모든 필드를 동적으로 인덱싱합니다. 샘플 쿼리는 gte 및 lte 필드를 사용하여 숫자 값 배열에서 지정된 값 사이의 모든 값을 Atlas Search에 사용합니다.
샘플 인덱스
default 이라는 이름의 다음 인덱스 정의는 숫자 값의 배열인 accounts 필드를 포함하여 모든 필드를 동적으로 인덱싱합니다.
{ "mappings": { "dynamic": true } }
샘플 쿼리
다음 쿼리는 250000 ~ 300000 사이의 고객 계정을 검색합니다. 여기에는 출력을 5 결과로 제한하는 $limit 단계와 accounts 및 name 를 제외한 모든 필드를 제외하는 $project 단계가 포함됩니다.
1 db.customers.aggregate([ 2 { 3 "$search": { 4 "range": { 5 "path": "accounts", 6 "gt": 250000, 7 "lt": 400000 8 } 9 } 10 }, 11 { 12 "$limit": 5 13 }, 14 { 15 "$project": { 16 "_id": 0, 17 "accounts": 1, 18 "name": 1 19 } 20 } 21 ])
1 [ 2 { 3 name: 'Elizabeth Ray', 4 accounts: [ 371138, 324287, 276528, 332179, 422649, 387979 ] 5 }, 6 { 7 name: 'Katherine David', 8 accounts: [ 462501, 228290, 968786, 515844, 377292 ] 9 }, 10 { 11 name: 'Brad Cardenas', 12 accounts: [ 721914, 817222, 973067, 260799, 87389 ] 13 }, 14 { 15 name: 'Gary Nichols', 16 accounts: [ 385397, 337979, 325377, 440243, 586395, 86702 ] 17 }, 18 { name: 'Jennifer Lawrence', accounts: [ 344885, 839927, 853542 ] } 19 ]
날짜 예시
다음 예시에서는 range 연산자를 사용하여 sample_mflix.movies 컬렉션의 날짜 필드를 쿼리합니다. 이 예시에서는 정적 또는 동적 매핑을 사용하여 컬렉션에서 released이라는 date 유형 필드를 인덱싱할 수 있습니다.
샘플 인덱스
default이라는 이름의 다음 인덱스 정의는 date 유형인 released 필드를 포함하여 movies collection의 모든 동적으로 인덱싱할 수 있는 필드를 인덱싱합니다.
{ "mappings": { "dynamic": true } }
default 이라는 이름의 다음 인덱스 정의는 movies 컬렉션의 released 필드를 인덱싱합니다.
{ "mappings": { "dynamic": false, "fields": { "released": { "type": "date" } } } }
샘플 쿼리
다음 쿼리는 2010년 1월 1일과 2015년 1월 1일 사이에 개봉한 영화를 검색합니다. 여기에는 출력 결과를 5개로 제한하는 $limit 단계와 title 및 released를 제외한 모든 필드를 제외하는 $project 단계가 포함되어 있습니다.
1 db.movies.aggregate([ 2 { 3 "$search": { 4 "range": { 5 "path": "released", 6 "gt": ISODate("2010-01-01T00:00:00.000Z"), 7 "lt": ISODate("2015-01-01T00:00:00.000Z") 8 } 9 } 10 }, 11 { 12 "$limit": 5 13 }, 14 { 15 "$project": { 16 "_id": 0, 17 "title": 1, 18 "released": 1 19 } 20 } 21 ])
1 [ 2 { 3 title: 'Too Much Johnson', 4 released: ISODate('2014-08-30T00:00:00.000Z') 5 }, 6 { 7 title: 'Stolen Desire', 8 released: ISODate('2012-07-01T00:00:00.000Z') 9 }, 10 { 11 title: 'The Monkey King', 12 released: ISODate('2012-01-12T00:00:00.000Z') 13 }, 14 { title: 'The Land', released: ISODate('2012-08-04T00:00:00.000Z') }, 15 { 16 title: 'My Childhood', 17 released: ISODate('2013-07-31T00:00:00.000Z') 18 } 19 ]
ObjectId 예시
다음 예시에서는 range 연산자를 사용하여 sample_mflix.movies 컬렉션의 objectId 필드를 쿼리합니다. 이 예시에서는 정적 또는 동적 매핑을 사용하여 컬렉션에서 _id라는 objectId 유형 필드를 인덱싱할 수 있습니다.
샘플 인덱스
default라고 명명된 다음 인덱스 정의는 movies 컬렉션의 모든 필드를 인덱싱합니다.
default이라는 이름의 다음 인덱스 정의는 objectId 유형인 _id 필드를 포함하여 movies collection의 모든 동적으로 인덱싱할 수 있는 필드를 인덱싱합니다.
{ "mappings": { "dynamic": true } }
default 이라는 이름의 다음 인덱스 정의는 movies 컬렉션의 _id 필드를 인덱싱합니다.
{ "mappings": { "dynamic": false, "fields": { "_id": { "type": "objectId" } } } }
샘플 쿼리
다음 예시는 range 연산자를 사용하여 sample_mflix.movies 컬렉션의 _id 필드에서 objectId 값 범위를 쿼리합니다.
1 db.movies.aggregate([ 2 { 3 "$search": { 4 "range": { 5 "path": "_id", 6 "gte": ObjectId("573a1396f29313caabce4a9a"), 7 "lte": ObjectId('573a1396f29313caabce4ae7') 8 } 9 } 10 }, 11 { 12 "$project": { 13 "_id": 1, 14 "title": 1, 15 "released": 1 16 } 17 } 18 ])
1 [ 2 { 3 _id: ObjectId('573a1396f29313caabce4a9a'), 4 title: 'The Godfather', 5 released: ISODate('1972-03-24T00:00:00.000Z') 6 }, 7 { 8 _id: ObjectId('573a1396f29313caabce4a9b'), 9 title: 'Get to Know Your Rabbit', 10 released: ISODate('1972-06-01T00:00:00.000Z') 11 }, 12 { 13 _id: ObjectId('573a1396f29313caabce4aad'), 14 title: 'The Tall Blond Man with One Black Shoe', 15 released: ISODate('1973-08-30T00:00:00.000Z') 16 }, 17 { 18 _id: ObjectId('573a1396f29313caabce4abe'), 19 title: 'The Great Northfield Minnesota Raid', 20 released: ISODate('1972-05-12T00:00:00.000Z') 21 }, 22 { 23 _id: ObjectId('573a1396f29313caabce4ac4'), 24 title: 'The Heartbreak Kid', 25 released: ISODate('1973-02-01T00:00:00.000Z') 26 }, 27 { 28 _id: ObjectId('573a1396f29313caabce4ac7'), 29 title: 'Gumshoe', 30 released: ISODate('1971-12-01T00:00:00.000Z') 31 }, 32 { 33 _id: ObjectId('573a1396f29313caabce4ad9'), 34 title: 'Heat', 35 released: ISODate('1972-10-06T00:00:00.000Z') 36 }, 37 { 38 _id: ObjectId('573a1396f29313caabce4ae7'), 39 title: 'Horror Express', 40 released: ISODate('1973-12-01T00:00:00.000Z') 41 } 42 ]
문자열 예시
다음 예시 range 연산자 사용하여 sample_mflix.movies 컬렉션 의 문자열 필드 쿼리 . 이 예시 에서는 정적 매핑을 사용하여 컬렉션 의 title 필드 MongoDB Search token 유형으로 인덱스 해야 합니다.
샘플 인덱스
default 이라는 이름의 다음 인덱스 정의는 movies 컬렉션 의 title 필드 MongoDB Search token 유형으로 인덱싱합니다.
{ "mappings": { "dynamic": false, "fields": { "title": { "type": "token", "normalizer": "lowercase" } } } }
샘플 쿼리
다음 쿼리는 city 와 country 사이의 문자가 포함된 영화 제목을 검색합니다. 여기에는 출력을 5 결과로 제한하는 $limit 단계와 title을 제외한 모든 필드를 제외하는 $project 단계가 포함되어 있습니다.
1 db.movies.aggregate([ 2 { 3 "$search": { 4 "range": { 5 "path": "title", 6 "gt": "city", 7 "lt": "country" 8 } 9 } 10 }, 11 { 12 "$limit": 5 13 }, 14 { 15 "$project": { 16 "_id": 0, 17 "title": 1 18 } 19 } 20 ])
[ { title: 'Civilization' }, { title: 'Clash of the Wolves' }, { title: 'City Lights' }, { title: 'Comradeship' }, { title: 'Come and Get It' } ]
내장된 문서 예시
다음 쿼리는 sample_training.companies 컬렉션의 funding_rounds.raised_amount 필드에서 500000 이상이고 1000000 이하인 값을 검색합니다. returnStoredSource: true 와 returnScope를 사용하여 funding_rounds 객체 배열 내의 필드를 조회하고 반환하며, 이 필드는 mongot에 저장됩니다. 이 쿼리는 저장된 소스에 대한 상대 경로 사용 예시의 샘플 인덱스를 사용합니다.
➤ Search Playground에서 사용해 보세요. MongoDB 검색 플레이그라운드의 데이터가 다음 예시에서 사용된 샘플 컬렉션보다 작기 때문에 MongoDB 검색 플레이그라운드의 결과는 다를 수 있습니다.
1 db.companies.aggregate([ 2 { 3 "$search": { 4 "range": { 5 "path": "funding_rounds.raised_amount", 6 "gte": 500000, 7 "lte": 1000000 8 }, 9 "returnStoredSource": true, 10 "returnScope": { 11 "path": "funding_rounds" 12 } 13 } 14 }, 15 { 16 "$limit": 5 17 } 18 ])
[ { round_code: 'angel', raised_amount: 500000, raised_currency_code: 'USD' }, { round_code: 'angel', raised_amount: 800000, raised_currency_code: 'USD' }, { round_code: 'c', raised_amount: 1000000, raised_currency_code: 'USD' }, { round_code: 'seed', raised_amount: 1000000, raised_currency_code: 'USD' }, { round_code: 'a', raised_amount: 1000000, raised_currency_code: 'USD' } ]
메타데이터 예시
다음 쿼리는 런타임이 2 보다 크거나 같고 3보다 작거나 같은 영화를 검색합니다. 이 쿼리는 $searchMeta 단계를 사용하여 검색 기준과 일치하는 다음 버킷(연도)의 모든 영화를 조회합니다.
1990, 이 버킷에 대한 포괄적인 하한값
2000, 1990 버킷의 상한 제외 및 이 버킷의 하한 포함
2010, 2000 버킷의 상한 제외 및 이 버킷의 하한 포함
2020, 2010 버킷의 배타적 상한선
쿼리는 sample_mflix.movies 네임스페이스의 모든 필드를 동적으로 인덱싱하는 default 이라는 인덱스를 사용합니다.
db.movies.aggregate([ { "$searchMeta": { "facet": { "operator": { "range": { "path": "runtime", "gte": 2, "lte": 3 } }, "facets": { "yearFacet": { "type": "number", "path": "year", "boundaries": [1990, 2000, 2010, 2020 ] } } } } } ])
[ { count: { lowerBound: Long('15') }, facet: { yearFacet: { buckets: [ { _id: 1990, count: Long('2') }, { _id: 2000, count: Long('3') }, { _id: 2010, count: Long('5') } ] } } } ]