Definição
geoShapeO operador
geoShapeoferece suporte à query de formas relacionadas a uma determinada geometria seindexShapesfor definido comotruena 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
-180e180, ambos inclusos. Os valores de latitude podem estar entre-90e90, ambos inclusos. Os valores de coordenadas podem ser inteiros ou duplos.Observação
A Pesquisa do MongoDB não é compatível com o 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 MongoDB Search e o operador $geoIntersects do MongoDB utilizam geometrias diferentes. Essa diferença pode ser vista em como o MongoDB Search e o MongoDB desenham as bordas poligonais. O MongoDB Search desenha polígonos com base na distância cartesiana, que é a linha mais curta entre dois pontos no sistema de referência de coordenadas. MongoDB desenha polígonos usando o modo geodésico baseado em índices2dsphere construídos sobre uma biblioteca de terceiros para tipos geodésicos, ou o modo plano, de índices2d. Para saber mais, consulte Objetos GeoJSON. A Pesquisa do MongoDB e o 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 geo indexado para pesquisa. | 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
The following examples use the listingsAndReviews collection in the sample_airbnb database. If you have the sample dataset on your cluster, you can create a custom MongoDB Search index for geo type and run the example queries on your cluster. The MongoDB Search Quick Start contains instructions for loading the sample dataset, creating an index definition, and running MongoDB Search queries.
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": "token" 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
$limitpara limitar a saída a3resultados.Estágio
$projectpara excluir todos os campos, excetonameeaddress.
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
$limitpara limitar a saída a3resultados.Estágio
$projectpara excluir todos os campos, excetonameeaddress.
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
$limitpara limitar a saída a3resultados.Estágio
$projectpara excluir todos os campos, excetonameeaddress.
Pesquisa básica
A query a seguir 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 consulta a seguir retorna o número de tipos de propriedades (como apartamento, casa e assim por diante) para os critérios de pesquisa 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.