geoWithin
정의
geoWithin
geoWithin
연산자는 주어진 지오메트리 내의 지리적 점에 대한 쿼리를 지원합니다. 인덱스 정의에서indexShapes
값이true
인 경우에도 점만 반환됩니다.다음 항목 내의 점을 쿼리할 수 있습니다.
원
경계 박스
다각형
검색할 좌표를 지정할 때는 경도를 먼저 지정한 다음 위도를 지정해야 합니다. 경도 값 범위는
-180
~180
사이이며 둘 다 포함합니다. 위도 값 범위는-90
~90
이며 둘 다 포함합니다. 좌표 값은 정수 또는 이중 값일 수 있습니다.참고
Atlas Search에서는 다음을 지원하지 않습니다.
기본값이 좌표 기준계(CRS)
평면형 XY 좌표계(2차원)
좌표 쌍 점 표기법(즉,
pointFieldName: [12, 34]
)
구문
geoWithin
의 구문은 다음과 같습니다:
{ "$search": { "index": <index name>, // optional, defaults to "default" "geoWithin": { "path": "<field-to-search>", "box | circle | geometry": <object>, "score": <score-options> } } }
옵션
geoWithin
는 다음 용어를 사용하여 쿼리를 구성합니다:
필드 | 유형 | 설명 | 필요성 |
---|---|---|---|
| 객체 | 검색할 상자의 왼쪽 아래와 오른쪽 위 GeoJSON 포인트를 지정하는 객체입니다. 객체는 다음 필드를 사용합니다. GeoJSON 객체 내에서 GeoJSON 데이터를 지정하는 방법을 알아보려면 GeoJSON 객체를 참조하세요.
| 조건부 |
| 객체 | Atlas Search의 중심점과 반경을 미터 단위로 지정하는 객체입니다. 객체에는 다음과 같은 GeoJSON 필드가 포함되어 있습니다.
GeoJSON 객체 내에서 GeoJSON 데이터를 지정하는 방법을 알아보려면 GeoJSON 객체를 참조하세요.
| 조건부 |
| GeoJSON 객체 | Atlas Search 내에서 다중 GeoJSON 다각형 또는 다각형 을 지정하는 객체입니다. 다각형은 마지막 위치가 첫 번째 위치와 동일한 닫힌 루프로 지정되어야 합니다. 지리 공간적 결과를 계산할 때 Atlas Search geoShape 및 geoWithin 연산자와 MongoDB $geoIntersects 연산자 는 서로 다른 도형을 사용합니다. 이 차이점은 Atlas Search 와 MongoDB 가 다각형 가장자리를 그리는 방식에서 확인할 수 있습니다. Atlas Search는 데카르트 거리 를 기반으로 다각형을 그립니다. 은 좌표 참조 시스템에서 두 점을 잇는 가장 짧은 선입니다. MongoDB 는 측지 유형용 타사 라이브러리 위에 구축된 dsphere 2 인덱스를 기반으로 하는 측지 모드 또는 2d 인덱스의 플랫 모드 를 사용하여 다각형을 그립니다. 학습 내용은 GeoJSON 객체를 참조하세요. Atlas Search와 MongoDB는 다각형과 관련된 지리 공간적 쿼리에 대해 서로 다른 결과를 반환할 수 있습니다. GeoJSON 객체 내에서 GeoJSON 데이터를 지정하는 방법을 알아보려면 GeoJSON 객체를 참조하세요.
| 조건부 |
| 문자열 또는 문자열 배열 | 인덱싱된 지역 유형에서 검색할 필드를 하나 이상 입력합니다. 경로 구성을 참조하세요. | 네 |
| 객체 | 일치하는 검색 결과에 할당할 점수입니다. 기본적으로 결과의 점수 는
쿼리에서 | no |
예시
다음 예제에서는 sample_airbnb
데이터베이스의 listingsAndReviews
컬렉션을 사용합니다. 클러스터에 샘플 데이터 세트 가 있는 경우 지리적 유형에 대한 사용자 지정 Atlas Search 인덱스를 만들고 클러스터에서 예제 쿼리를 실행할 수 있습니다.
팁
샘플 데이터 집합을 이미 로드한 경우, Atlas Search 시작하기 자습서에 따라 인덱스 정의를 만들고 Atlas Search 쿼리를 실행하세요.
다음 샘플 데이터 세트 중 하나를 사용하여 geoWithin
연산자와 함께 Atlas Search 검색 쿼리를 실행할 수 있습니다.
listingsAndReviews
collection의 address.location
필드를 인덱싱하려면 다음 샘플 인덱스 정의를 사용합니다.
1 { 2 "mappings": { 3 "fields": { 4 "address": { 5 "fields": { 6 "location": { 7 "type": "geo" 8 } 9 }, 10 "type": "document" 11 } 12 } 13 } 14 }
box
예시
다음 쿼리는 geoWithin
연산자와 box
필드를 사용하여 오스트레일리아의 경계 상자 내 속성을 검색합니다.
쿼리에는 다음이 포함됩니다.
참고
Atlas Search 검색 쿼리에 default
이라는 인덱스를 지정할 필요가 없습니다. 인덱스에 다른 이름이 있는 경우 index
필드를 지정해야 합니다.
1 db.listingsAndReviews.aggregate([ 2 { 3 "$search": { 4 "geoWithin": { 5 "path": "address.location", 6 "box": { 7 "bottomLeft": { 8 "type": "Point", 9 "coordinates": [112.467, -55.050] 10 }, 11 "topRight": { 12 "type": "Point", 13 "coordinates": [168.000, -9.133] 14 } 15 } 16 } 17 } 18 }, 19 { 20 $limit: 3 21 }, 22 { 23 $project: { 24 "_id": 0, 25 "name": 1, 26 "address": 1 27 } 28 } 29 ])
쿼리는 다음과 같은 결과를 반환합니다.
1 { 2 "name" : "Surry Hills Studio - Your Perfect Base in Sydney", 3 "address" : { 4 "street" : "Surry Hills, NSW, Australia", 5 "suburb" : "Darlinghurst", 6 "government_area" : "Sydney", 7 "market" : "Sydney", 8 "country" : "Australia", 9 "country_code" : "AU", 10 "location" : { 11 "type" : "Point", 12 "coordinates" : [ 151.21554, -33.88029 ], 13 "is_location_exact" : true 14 } 15 } 16 } 17 { 18 "name" : "Sydney Hyde Park City Apartment (checkin from 6am)", 19 "address" : { 20 "street" : "Darlinghurst, NSW, Australia", 21 "suburb" : "Darlinghurst", 22 "government_area" : "Sydney", 23 "market" : "Sydney", 24 "country" : "Australia", 25 "country_code" : "AU", 26 "location" : { 27 "type" : "Point", 28 "coordinates" : [ 151.21346, -33.87603 ], 29 "is_location_exact" : false 30 } 31 } 32 } 33 { 34 "name" : "THE Place to See Sydney's FIREWORKS", 35 "address" : { 36 "street" : "Rozelle, NSW, Australia", 37 "suburb" : "Lilyfield/Rozelle", 38 "government_area" : "Leichhardt", 39 "market" : "Sydney", 40 "country" : "Australia", 41 "country_code" : "AU", 42 "location" : { 43 "type" : "Point", 44 "coordinates" : [ 151.17956, -33.86296 ], 45 "is_location_exact" : true 46 } 47 } 48 }
circle
예시
다음 쿼리는 geoWithin
연산자와 circle
필드를 사용하여 캐나다의 지정된 좌표에서 반경 1마일 이내에 있는 속성을 검색합니다.
쿼리에는 다음이 포함됩니다.
참고
Atlas Search 검색 쿼리에 default
이라는 인덱스를 지정할 필요가 없습니다. 인덱스에 다른 이름이 있는 경우 index
필드를 지정해야 합니다.
1 db.listingsAndReviews.aggregate([ 2 { 3 "$search": { 4 "geoWithin": { 5 "circle": { 6 "center": { 7 "type": "Point", 8 "coordinates": [-73.54, 45.54] 9 }, 10 "radius": 1600 11 }, 12 "path": "address.location" 13 } 14 } 15 }, 16 { 17 $limit: 3 18 }, 19 { 20 $project: { 21 "_id": 0, 22 "name": 1, 23 "address": 1 24 } 25 } 26 ])
쿼리는 다음과 같은 결과를 반환합니다.
1 { 2 "name" : "Ligne verte - à 15 min de métro du centre ville.", 3 "address" : { 4 "street" : "Montréal, Québec, Canada", 5 "suburb" : "Hochelaga-Maisonneuve", 6 "government_area" : "Mercier-Hochelaga-Maisonneuve", 7 "market" : "Montreal", 8 "country" : "Canada", 9 "country_code" : "CA", 10 "location" : { 11 "type" : "Point", 12 "coordinates" : [ -73.54949, 45.54548 ], 13 "is_location_exact" : false 14 } 15 } 16 } 17 { 18 "name" : "Belle chambre à côté Metro Papineau", 19 "address" : { 20 "street" : "Montréal, QC, Canada", 21 "suburb" : "Gay Village", 22 "government_area" : "Ville-Marie", 23 "market" : "Montreal", 24 "country" : "Canada", 25 "country_code" : "CA", 26 "location" : { 27 "type" : "Point", 28 "coordinates" : [ -73.54985, 45.52797 ], 29 "is_location_exact" : false 30 } 31 } 32 } 33 { 34 "name" : "L'IDÉAL, ( à 2 min du métro Pie-IX ).", 35 "address" : { 36 "street" : "Montréal, Québec, Canada", 37 "suburb" : "Mercier-Hochelaga-Maisonneuve", 38 "government_area" : "Mercier-Hochelaga-Maisonneuve", 39 "market" : "Montreal", 40 "country" : "Canada", 41 "country_code" : "CA", 42 "location" : { 43 "type" : "Point", 44 "coordinates" : [ -73.55208, 45.55157 ], 45 "is_location_exact" : true 46 } 47 } 48 }
geometry
예시
다음 예시에서는 geometry
필드와 함께 geoWithin
연산자를 사용하여 하와이의 속성을 검색합니다. type
필드는 해당 영역이 GeoJSON 다각형인지 다중 다각형인지를 지정합니다.
쿼리에는 다음이 포함됩니다.
참고
Atlas Search 검색 쿼리에 default
이라는 인덱스를 지정할 필요가 없습니다. 인덱스에 다른 이름이 있는 경우 index
필드를 지정해야 합니다.
1 db.listingsAndReviews.aggregate([ 2 { 3 "$search": { 4 "geoWithin": { 5 "geometry": { 6 "type": "Polygon", 7 "coordinates": [[[ -161.323242, 22.512557 ], 8 [ -152.446289, 22.065278 ], 9 [ -156.09375, 17.811456 ], 10 [ -161.323242, 22.512557 ]]] 11 }, 12 "path": "address.location" 13 } 14 } 15 }, 16 { 17 $limit: 3 18 }, 19 { 20 $project: { 21 "_id": 0, 22 "name": 1, 23 "address": 1 24 } 25 } 26 ])
쿼리는 다음과 같은 결과를 반환합니다.
1 { 2 "name" : "Ocean View Waikiki Marina w/prkg", 3 "address" : { 4 "street" : "Honolulu, HI, United States", 5 "suburb" : "Oʻahu", 6 "government_area" : "Primary Urban Center", 7 "market" : "Oahu", 8 "country" : "United States", 9 "country_code" : "US", 10 "location" : { 11 "type" : "Point", 12 "coordinates" : [ -157.83919, 21.28634 ], 13 "is_location_exact" : true 14 } 15 } 16 } 17 { 18 "name" : "Kailua-Kona, Kona Coast II 2b condo", 19 "address" : { 20 "street" : "Kailua-Kona, HI, United States", 21 "suburb" : "Kailua/Kona", 22 "government_area" : "North Kona", 23 "market" : "The Big Island", 24 "country" : "United States", 25 "country_code" : "US", 26 "location" : { 27 "type" : "Point", 28 "coordinates" : [ -155.96445, 19.5702 ], 29 "is_location_exact" : true 30 } 31 } 32 } 33 { 34 "name" : "LAHAINA, MAUI! RESORT/CONDO BEACHFRONT!! SLEEPS 4!", 35 "address" : { 36 "street" : "Lahaina, HI, United States", 37 "suburb" : "Maui", 38 "government_area" : "Lahaina", 39 "market" : "Maui", 40 "country" : "United States", 41 "country_code" : "US", 42 "location" : { 43 "type" : "Point", 44 "coordinates" : [ -156.68012, 20.96996 ], 45 "is_location_exact" : true 46 } 47 } 48 }
1 db.listingsAndReviews.aggregate([ 2 { 3 "$search": { 4 "geoWithin": { 5 "geometry": { 6 "type": "MultiPolygon", 7 "coordinates": [ 8 [[[-157.8412413882,21.2882235819], 9 [-157.8607925468,21.2962046205], 10 [-157.8646640634,21.3077019651], 11 [-157.862776699,21.320776283], 12 [-157.8341758705,21.3133826738], 13 [-157.8349985678,21.3000822569], 14 [-157.8412413882,21.2882235819]]], 15 [[[-157.852898124,21.301208833], 16 [-157.8580050499,21.3050871833], 17 [-157.8587346108,21.3098050385], 18 [-157.8508811028,21.3119240258], 19 [-157.8454308541,21.30396767], 20 [-157.852898124,21.301208833]]] 21 ] 22 }, 23 "path": "address.location" 24 } 25 } 26 }, 27 { 28 $limit: 3 29 }, 30 { 31 $project: { 32 "_id": 0, 33 "name": 1, 34 "address": 1 35 } 36 } 37 ])
쿼리는 다음과 같은 결과를 반환합니다.
1 { 2 "name" : "Heart of Honolulu, 2BD gem! Free Garage Parking!", 3 "address" : { 4 "street" : "Honolulu, HI, United States", 5 "suburb" : "Makiki/Lower Punchbowl/Tantalus", 6 "government_area" : "Primary Urban Center", 7 "market" : "Oahu", 8 "country" : "United States", 9 "country_code" : "US", 10 "location" : { 11 "type" : "Point", 12 "coordinates" : [ -157.84343, 21.30852 ], 13 "is_location_exact" : false 14 } 15 } 16 } 17 { 18 "name" : "Private Studio closed to town w/ compact parking", 19 "address" : { 20 "street" : "Honolulu, HI, United States", 21 "suburb" : "Oʻahu", 22 "government_area" : "Primary Urban Center", 23 "market" : "Oahu", 24 "country" : "United States", 25 "country_code" : "US", 26 "location" : { 27 "type" : "Point", 28 "coordinates" : [ -157.85228, 21.31184 ], 29 "is_location_exact" : true 30 } 31 } 32 } 33 { 34 "name" : "Comfortable Room (2) at Affordable Rates", 35 "address" : { 36 "street" : "Honolulu, HI, United States", 37 "suburb" : "Oʻahu", 38 "government_area" : "Primary Urban Center", 39 "market" : "Oahu", 40 "country" : "United States", 41 "country_code" : "US", 42 "location" : { 43 "type" : "Point", 44 "coordinates" : [ -157.83889, 21.29776 ], 45 "is_location_exact" : false 46 } 47 } 48 }