정의
구문
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 } 10 } 11 }
옵션
range 는 다음 용어를 사용하여 쿼리를 구성합니다:
필드 | 유형 | 설명 | 필요성 |
|---|---|---|---|
| BSON 날짜, 숫자, 문자열 또는 objectId | no | |
| BSON 날짜, 숫자, 문자열 또는 objectId | no | |
| 문자열 또는 문자열 배열 | 인덱싱된 필드 또는 검색할 필드. | 네 |
| 객체 | 일치하는 검색 결과에 할당된 점수를 수정합니다. 다음 옵션을 사용하여 기본 점수를 수정할 수 있습니다.
배열 값을 쿼리할 때 MongoDB Search는 배열 에서 쿼리 와 일치하는 값의 수에 관계없이 동일한 점수를 할당합니다. 쿼리에서 | no |
예시
다음 예시에서는 샘플 데이터의 컬렉션을 사용합니다. 클러스터에 샘플 데이터를 로드한 경우, 아래 예시의 인덱스 정의를 사용하여 인덱스를 생성하고 클러스터에서 예시 쿼리를 실행할 수 있습니다.
번호 예시
다음 예시에서는 샘플 데이터의 숫자 필드에 인덱스를 사용하고 인덱싱된 필드에 대해 range 쿼리를 실행합니다.
이 예에서는 정적 또는 동적 매핑을 사용하여 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' } ]
내장된 문서 예시
다음 funding_rounds.raised_amount 쿼리 sample_training.companies 500000 1000000컬렉션 의 필드 에서 보다 크거나 같은 금액과 보다 작거나 같은 금액을 검색합니다.returnStoredSource: true 및 returnScope 를 사용하여 에 저장된 funding_rounds 객체 배열 내의 필드를 조회 하고 mongot 반환합니다. 쿼리 저장된 소스에 상대 경로 사용 예시 의 샘플 인덱스 사용합니다.
➤ 검색 플레이그라운드에서 시도해 보세요. MongoDB Search 플레이그라운드의 데이터가 다음 예시 에 사용된 샘플 컬렉션 보다 작기 때문에 MongoDB Search 플레이그라운드의 결과는 다를 수 있습니다.
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') } ] } } } ]