Definición
geoShapeEl operador
geoShapepermite consultar formas relacionadas con una geometría dada siindexShapesestá configurado entrueen el definición de índice.Al especificar las coordenadas de búsqueda, primero se debe especificar la longitud y luego la latitud. Los valores de longitud pueden estar entre
-180y180, ambos inclusive. Los valores de latitud pueden estar entre-90y90, ambos inclusive. Los valores de coordenadas pueden ser enteros o dobles.Nota
La búsqueda de MongoDB no admite lo siguiente:
Sistema de referencia de coordenadas (CRS) no predeterminado
Sistema de coordenadas XY planas (2 dimensión)
Pares de coordenadas Notación de puntos (es decir,
pointFieldName: [12, 34])
Sintaxis
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 }
opciones
geoShape utiliza los siguientes términos para construir una consulta:
Campo | Tipo | Descripción | Necesidad |
|---|---|---|---|
| Objeto GeoJSON | ObjetoGeoJSON que especifica la forma o punto de búsqueda (Polígono, MultiPolígono o Cadena de Líneas). El polígono debe especificarse como un bucle cerrado donde la última posición coincida con la primera. Al calcular resultados geoespaciales, los operadores geoShape y geoWithin de MongoDB Search y el operador $geoIntersects de MongoDB utilizan geometrías diferentes. Esta diferencia se observa en cómo MongoDB Search y MongoDB dibujan los bordes poligonales. MongoDB Search dibuja polígonos según la distancia cartesiana, que es la línea más corta entre dos puntos en el sistema de referencia de coordenadas. MongoDB dibuja polígonos utilizando el modo geodésico con 2índices dsphere que están construidos sobre una librería de terceros para tipos geodésicos, o el modo plano, de 2índices d. Para obtener más información, consulte Objetos GeoJSON. MongoDB Search y MongoDB podrían devolver resultados diferentes para consultas geoespaciales que involucren polígonos. | sí |
| cadena o matriz de cadenas | Campo o campos de tipo geo indexados para búsqueda. | sí |
| enum | Relación entre la geometría de la forma de la consulta y la geometría del campo indexado. El valor puede ser uno de los siguientes:
| sí |
| Objeto | Puntuación para asignar a los resultados de búsqueda coincidentes. Por defecto, la puntuación en los resultados
Para obtener información sobre el uso de | no |
Ejemplos
Los siguientes ejemplos utilizan la listingsAndReviews colección en la sample_airbnb base de datos. Si tiene el conjunto de datos de ejemplo en su clúster, puede crear un índice de MongoDB Search personalizado para el tipo geográfico y ejecutar las consultas de ejemplo en su clúster. La Guía de inicio rápido de MongoDB Search contiene instrucciones para cargar el conjunto de datos de ejemplo, crear una definición de índice y ejecutar consultas de MongoDB Search.
La siguiente es una definición de índice de muestra para indexar el campo address.location en la colección 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 }
Ejemplo disjunto
El siguiente ejemplo utiliza el operador geoShape para buscar propiedades que no tienen nada en común con las coordenadas de longitud y latitud especificadas en Hawái.
La query incluye lo siguiente:
$limitetapa para limitar la salida a3resultados.$projectetapa para excluir todos los campos exceptonameaddressy.
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 } } }
Ejemplo de intersecciones
El siguiente ejemplo utiliza el operador geoShape para buscar propiedades que intersecan con las coordenadas de longitud y latitud especificadas en España.
La query incluye lo siguiente:
$limitetapa para limitar la salida a3resultados.$projectetapa para excluir todos los campos exceptonameaddressy.
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 del ejemplo
El siguiente ejemplo utiliza el operador geoShape para buscar propiedades en Nueva York que se encuentren dentro de las coordenadas de longitud y latitud especificadas. La consulta busca en el campo address.location de la colección listingsAndReviews de la base de datos sample_airbnb.
La query incluye lo siguiente:
$limitetapa para limitar la salida a3resultados.$projectetapa para excluir todos los campos exceptonameaddressy.
Búsqueda básica
La siguiente consulta devuelve los documentos que coinciden con los criterios de búsqueda 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 }
Búsqueda de metadatos
La siguiente consulta devuelve el número de tipos de propiedades (como apartamento, casa, etc.) para los criterios de búsqueda 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') } ] } } } ]
Los resultados de la consulta muestran los diferentes tipos de propiedades en las coordenadas especificadas.