GeoWithin
Definição
geoWithin
O operador
geoWithin
dá suporte à query de pontos geograficamente em uma determinada modelagem. Somente os pontos são retornados, mesmo que o valorindexShapes
sejatrue
nadefinição do índice .Você pode consultar pontos dentro de um:
Círculo
Caixa delimitadora
Polígono
Ao especificar as coordenadas a serem pesquisadas, a longitude deve ser especificada primeiro e depois a latitude. Os valores de longitude podem estar entre
-180
e180
, ambos inclusos. Os valores de latitude podem estar entre-90
e90
, ambos inclusos. Os valores de coordenadas podem ser inteiros ou duplos.Observação
O Atlas Search não oferece suporte ao seguinte:
Sistema de Referência de Coordenadas Não Padrão (CRS)
Sistema de coordenadas Planar XY (bidimensional)
Pares de coordenadas Notação de ponto (ou seja,
pointFieldName: [12, 34]
)
Sintaxe
geoWithin
tem a seguinte sintaxe:
{ "$search": { "index": <index name>, // optional, defaults to "default" "geoWithin": { "path": "<field-to-search>", "box | circle | geometry": <object>, "score": <score-options> } } }
Opções
geoWithin
usa os seguintes termos para construir uma consulta:
Campo | Tipo | Descrição | necessidade |
---|---|---|---|
box | objeto | Objeto que especifica os pontos GeoJSON inferior esquerdo e superior direito de uma caixa a ser pesquisada. O objeto utiliza os seguintes campos:
Para saber como especificar dados GeoJSON em um objeto GeoJSON, consulte Objetos GeoJSON. É necessário | condicional |
circle | objeto | Objeto que especifica o ponto central e o raio em metros para o Atlas Search . O objeto contém os seguintes campos GeoJSON :
Para saber como especificar dados GeoJSON em um objeto GeoJSON, consulte Objetos GeoJSON. É necessário | condicional |
geometry | Objeto GeoJSON | Objeto GeoJSON que especifica o MultiPolígono ou Polígono para o Atlas Search . O polígono deve ser especificado como um loop fechado onde a última posição é igual à primeira posição. Ao calcular os resultados geoespaciais, os operadores geoChape e geoWithin do Atlas Search e o operador $geoIntersects do MongoDB usam geometrias diferentes. Essa diferença pode ser vista na forma como o Atlas Search e o MongoDB desenham arestas poligonais. O Atlas Search desenha polígonos com base na distância cartesiano, que é a linha mais curta entre dois pontos no sistema de referência de coordenadas. O MongoDB desenha polígonos usando uma biblioteca de terceiros para tipos geodésicos que usam linhas geodésicas. Para saber mais, consulte Objetos GeoJSON. Atlas Search e MongoDB podem retornar resultados diferentes para queries geoespaciais envolvendo polígonos. Para saber como especificar dados GeoJSON em um objeto GeoJSON, consulte Objetos GeoJSON. É necessário | condicional |
path | cadeia de caracteres ou matriz de cadeias de caracteres | Campo ou campos de tipo geográfico indexado a serem pesquisados. Consulte Construção de caminho. | sim |
score | objeto | Pontuação a ser atribuída aos resultados de pesquisa correspondentes. Por padrão, a pontuação nos resultados é
Para obter informações sobre como utilizar o | no |
Exemplos
Os exemplos abaixo utilizam a collection listingsAndReviews
no banco de dados sample_airbnb
. Se você tiver o conjunto de dados de amostra no seu cluster, você poderá criar um índice de pesquisa personalizado do Atlas Search para o tipo geográfico e executar as query de exemplo no seu cluster.
Dica
Se você já carregou o conjunto de dados de amostra, siga o tutorial Iniciar com Atlas Search para criar uma definição de índice e executar queries de Atlas Search.
Você pode usar qualquer um dos seguintes conjuntos de dados de amostra para executar query de pesquisa do Atlas Search com o operador geoWithin
:
Utilize a seguinte definição de índice de amostra para indexar o campo address.location
na collection listingsAndReviews
:
1 { 2 "mappings": { 3 "fields": { 4 "address": { 5 "fields": { 6 "location": { 7 "type": "geo" 8 } 9 }, 10 "type": "document" 11 } 12 } 13 } 14 }
box
Exemplo
A query seguinte utiliza o operador geoWithin
com o campo box
para search propriedade dentro de uma caixa delimitadora na Austrália.
A consulta inclui um:
Estágio
$limit
para limitar a saída a3
resultados.Estágio
$project
para excluir todos os campos, excetoname
eaddress
.
Observação
Você não precisa especificar índices chamados default
em sua query de pesquisa do Atlas Search. Se o seu índice tiver qualquer outro nome, você deverá especificar o campo 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 ])
A query retorna os seguintes resultados:
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
Exemplo
A query seguinte utiliza o operador geoWithin
com o campo circle
para search propriedade dentro de um raio de uma milha de coordenadas especificadas no Canadá.
A consulta inclui um:
Estágio
$limit
para limitar a saída a3
resultados.Estágio
$project
para excluir todos os campos, excetoname
eaddress
.
Observação
Você não precisa especificar índices chamados default
em sua query de pesquisa do Atlas Search. Se o seu índice tiver qualquer outro nome, você deverá especificar o campo 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 ])
A query retorna os seguintes resultados:
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
Exemplos
Os exemplos a seguir usam o operador geoWithin
com o campo geometry
para pesquisar propriedades no Havaí. O campo type
especifica se a área é um polígono GeoJSON ou MultiPolygon.
As queries incluem um:
Estágio
$limit
para limitar a saída a3
resultados.Estágio
$project
para excluir todos os campos, excetoname
eaddress
.
Observação
Você não precisa especificar índices chamados default
em sua query de pesquisa do Atlas Search. Se o seu índice tiver qualquer outro nome, você deverá especificar o campo 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 ])
A query retorna os seguintes resultados:
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 ])
A query retorna os seguintes resultados:
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 }