geoShape
Nesta página
Definição
geoShape
O operador
geoShape
oferece suporte à query de formas relacionadas a uma determinada geometria seindexShapes
for definido comotrue
na definição do índice .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
1 { 2 "$search": { 3 "index": <index name>, // optional, defaults to "default" 4 "geoShape": { 5 "path": "<field-to-search>", 6 "relation": "contains | disjoint | intersects | within", 7 "geometry": <GeoJSON-object>, 8 "score": <score-options> 9 } 10 } 11 }
Opções
geoShape
usa os seguintes termos para construir uma consulta:
Campo | Tipo | Descrição | necessidade |
---|---|---|---|
| Objeto GeoJSON | Objeto GeoJSON que especifica a forma Polígono, MultiPolígono ou LineString ou aponte 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 resultados geoespaciais, os operadores geoShape e geoWithin do Atlas Search e o operador $geoIntersects do MongoDB utilizam geometrias diferentes. Essa diferença pode ser vista em como o Atlas Search e o MongoDB desenham as bordas 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 o modo geodésico baseado em 2índices dsphere construídos sobre uma biblioteca de terceiros para tipos geodésicos, ou o modo plano, de 2índices d. Para saber mais, consulte Objetos GeoJSON. Atlas Search e MongoDB podem retornar resultados diferentes para queries geoespaciais envolvendo polígonos. | sim |
| cadeia de caracteres ou matriz de cadeias de caracteres | campo ou campos de tipo geográfico indexados a serem pesquisados. | sim |
| enum | Relação da geometria da forma de query com a geometria do campo indexado. O valor pode ser um dos seguintes:
| sim |
| 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 seguintes utilizam a coleção listingsAndReviews
no banco de dados sample_airbnb
. Se você tiver o conjunto de dados de amostra no seu cluster, você poderá criar um índice personalizado do Atlas Search para tipo geoespacial e executar as queries de exemplo no seu cluster. O Início Rápido do Atlas Search contém instruções para carregar o conjunto de dados de amostra, criar uma definição de índice e executar queries do Atlas Search.
O seguinte é uma 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 "indexShapes": true, 8 "type": "geo" 9 } 10 }, 11 "type": "document" 12 }, 13 "property_type": { 14 "type": "stringFacet" 15 } 16 } 17 } 18 }
Exemplo de desconexão
O exemplo a seguir usa o operador geoShape
para pesquisar propriedade que não têm nada em comum com as coordenadas de longitude e latitude especificadas no Havaí.
A consulta inclui um:
Estágio
$limit
para limitar a saída a3
resultados.Estágio
$project
para excluir todos os campos, excetoname
eaddress
.
1 db.listingsAndReviews.aggregate([ 2 { 3 "$search": { 4 "geoShape": { 5 "relation": "disjoint", 6 "geometry": { 7 "type": "Polygon", 8 "coordinates": [[[-161.323242,22.512557], 9 [-152.446289,22.065278], 10 [-156.09375,17.811456], 11 [-161.323242,22.512557]]] 12 }, 13 "path": "address.location" 14 } 15 } 16 }, 17 { 18 $limit: 3 19 }, 20 { 21 $project: { 22 "_id": 0, 23 "name": 1, 24 "address": 1, 25 score: { $meta: "searchScore" } 26 } 27 } 28 ])
{ "name" : "Ribeira Charming Duplex", "address" : { "street" : "Porto, Porto, Portugal", "suburb" : "", "government_area" : "Cedofeita, Ildefonso, Sé, Miragaia, Nicolau, Vitória", "market" : "Porto", "country" : "Portugal", "country_code" : "PT", "location" : { "type" : "Point", "coordinates" : [ -8.61308, 41.1413 ], "is_location_exact" : false } } } { "name" : "Horto flat with small garden", "address" : { "street" : "Rio de Janeiro, Rio de Janeiro, Brazil", "suburb" : "Jardim Botânico", "government_area" : "Jardim Botânico", "market" : "Rio De Janeiro", "country" : "Brazil", "country_code" : "BR", "location" : { "type" : "Point", "coordinates" : [ -43.23074991429229, -22.966253551739655 ], "is_location_exact" : true } } } { "name" : "Private Room in Bushwick", "address" : { "street" : "Brooklyn, NY, United States", "suburb" : "Brooklyn", "government_area" : "Bushwick", "market" : "New York", "country" : "United States", "country_code" : "US", "location" : { "type" : "Point", "coordinates" : [ -73.93615, 40.69791 ], "is_location_exact" : true } } }
Exemplo de intersecções
O exemplo a seguir usa o operador geoShape
para pesquisar propriedades que interseccionam com as coordenadas de longitude e latitude especificadas na Espanha.
A consulta inclui um:
Estágio
$limit
para limitar a saída a3
resultados.Estágio
$project
para excluir todos os campos, excetoname
eaddress
.
1 db.listingsAndReviews.aggregate([ 2 { 3 "$search": { 4 "geoShape": { 5 "relation": "intersects", 6 "geometry": { 7 "type": "MultiPolygon", 8 "coordinates": [ 9 [[[2.16942,41.40082], 10 [2.17963,41.40087], 11 [2.18146,41.39716], 12 [2.15533,41.40686], 13 [2.14596,41.38475], 14 [2.17519,41.41035], 15 [2.16942,41.40082]]], 16 [[[2.16365,41.39416], 17 [2.16963,41.39726], 18 [2.15395,41.38005], 19 [2.17935,41.43038], 20 [2.16365,41.39416]]] 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 score: { $meta: "searchScore" } 36 } 37 } 38 ])
{ "name" : "Cozy bedroom Sagrada Familia", "address" : { "street" : "Barcelona, Catalunya, Spain", "suburb" : "Eixample", "government_area" : "el Fort Pienc", "market" : "Barcelona", "country" : "Spain", "country_code" : "ES", "location" : { "type" : "Point", "coordinates" : [ 2.17963, 41.40087 ], "is_location_exact" : true } } } { "name" : "", "address" : { "street" : "Barcelona, Catalunya, Spain", "suburb" : "Vila de Gràcia", "government_area" : "la Vila de Gràcia", "market" : "Barcelona", "country" : "Spain", "country_code" : "ES", "location" : { "type" : "Point", "coordinates" : [ 2.15759, 41.40349 ], "is_location_exact" : true } } } { "name" : "SPACIOUS RAMBLA CATALUÑA", "address" : { "street" : "Barcelona, Catalunya, Spain", "suburb" : "L'Antiga Esquerra de l'Eixample", "government_area" : "l'Antiga Esquerra de l'Eixample", "market" : "Barcelona", "country" : "Spain", "country_code" : "ES", "location" : { "type" : "Point", "coordinates" : [ 2.15255, 41.39193 ], "is_location_exact" : true } } }
Dentro do exemplo
O exemplo a seguir usa o operador geoShape
para pesquisar propriedade em Nova York que estão dentro das coordenadas de longitude e latitude especificadas. A query pesquisar o campo address.location
na collection listingsAndReviews
no reconhecimento de data center sample_airbnb
.
A consulta inclui um:
Estágio
$limit
para limitar a saída a3
resultados.Estágio
$project
para excluir todos os campos, excetoname
eaddress
.
Pesquisa básica
A seguinte query retorna os documentos que correspondem aos critérios de pesquisa especificados.
1 db.listingsAndReviews.aggregate([ 2 { 3 "$search": { 4 "geoShape": { 5 "relation": "within", 6 "geometry": { 7 "type": "Polygon", 8 "coordinates": [[[-74.3994140625,40.5305017757], 9 [-74.7290039063,40.5805846641], 10 [-74.7729492188,40.9467136651], 11 [-74.0698242188,41.1290213475], 12 [-73.65234375,40.9964840144], 13 [-72.6416015625,40.9467136651], 14 [-72.3559570313,40.7971774152], 15 [-74.3994140625,40.5305017757]]] 16 }, 17 "path": "address.location" 18 } 19 } 20 }, 21 { 22 $limit: 3 23 }, 24 { 25 $project: { 26 "_id": 0, 27 "name": 1, 28 "address": 1, 29 score: { $meta: "searchScore" } 30 } 31 } 32 ])
{ "name" : "Private Room in Bushwick", "address" : { "street" : "Brooklyn, NY, United States", "suburb" : "Brooklyn", "government_area" : "Bushwick", "market" : "New York", "country" : "United States", "country_code" : "US", "location" : { "type" : "Point", "coordinates" : [ -73.93615, 40.69791 ], "is_location_exact" : true } }, { "name" : "New York City - Upper West Side Apt", "address" : { "street" : "New York, NY, United States", "suburb" : "Manhattan", "government_area" : "Upper West Side", "market" : "New York", "country" : "United States", "country_code" : "US", "location" : { "type" : "Point", "coordinates" : [ -73.96523, 40.79962 ], "is_location_exact" : false } }, "score" : 1 } { "name" : "Deluxe Loft Suite", "address" : { "street" : "Brooklyn, NY, United States", "suburb" : "Greenpoint", "government_area" : "Greenpoint", "market" : "New York", "country" : "United States", "country_code" : "US", "location" : { "type" : "Point", "coordinates" : [ -73.94472, 40.72778 ], "is_location_exact" : true } }, "score" : 1 }
Pesquisa de metadados
A query abaixo retorna o número de tipos de propriedades (como apartamento, casa e assim por diante) para os critérios de query especificados.
1 db.listingsAndReviews.aggregate([ 2 { 3 "$searchMeta": { 4 "facet": { 5 "operator": { 6 "geoShape": { 7 "relation": "within", 8 "geometry": { 9 "type": "Polygon", 10 "coordinates": [[[-74.3994140625,40.5305017757], 11 [-74.7290039063,40.5805846641], 12 [-74.7729492188,40.9467136651], 13 [-74.0698242188,41.1290213475], 14 [-73.65234375,40.9964840144], 15 [-72.6416015625,40.9467136651], 16 [-72.3559570313,40.7971774152], 17 [-74.3994140625,40.5305017757]]] 18 }, 19 "path": "address.location" 20 } 21 }, 22 "facets": { 23 "propertyTypeFacet": { 24 "type": "string", 25 "path": "property_type" 26 } 27 } 28 } 29 } 30 } 31 ])
[ { count: { lowerBound: Long('599') }, facet: { propertyTypeFacet: { buckets: [ { _id: 'Apartment', count: Long('486') }, { _id: 'House', count: Long('43') }, { _id: 'Townhouse', count: Long('24') }, { _id: 'Condominium', count: Long('19') }, { _id: 'Loft', count: Long('19') }, { _id: 'Guest suite', count: Long('2') }, { _id: 'Guesthouse', count: Long('2') }, { _id: 'Aparthotel', count: Long('1') }, { _id: 'Hostel', count: Long('1') }, { _id: 'Serviced apartment', count: Long('1') } ] } } } ]
Os resultados da query mostram os diferentes tipos de propriedades nas coordenadas especificadas.