Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
MongoDB Branding Shape
Click here >
Docs Menu

geoShape Operador

geoShape

El operador geoShape permite consultar formas con una relación a una geometría dada si indexShapes se establece en true en la definición del índice.

Al especificar las coordenadas para la búsqueda, primero se debe especificar la longitud y luego la latitud. Los valores de longitud pueden estar entre -180 y 180, ambos inclusive. Los valores de latitud pueden estar entre -90 y 90, ambos inclusive. Los valores de coordenadas pueden ser enteros o dobles.

Nota

MongoDB Search no admite lo siguiente:

  • Sistema de referencia de coordenadas (CRS) no por defecto

  • Sistema de coordenadas XY plano (2 dimensiones)

  • Pares coordinados Notación de puntos (es decir, pointFieldName: [12, 34])

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}

geoShape utiliza los siguientes términos para construir una query:

Campo
Tipo
Descripción
Necesidad

geometry

Objeto GeoJSON

Objeto GeoJSON que especifica la polígono, MultiPolygon, o LineString forma o punto a buscar. El polígono debe ser especificado como un bucle cerrado donde la última posición sea la misma que la primera posición.

Al calcular resultados geoespaciales, los operadores de MongoDB Search geoShape y geoWithin, así como el operador de MongoDB $geoIntersects, utilizan diferentes geometrías. Esta diferencia se puede observar en cómo MongoDB Search y MongoDB dibujan los bordes poligonales.

MongoDB Search dibuja polígonos basados en 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 queries geoespaciales que incluyan polígonos.

path

string o arreglo de strings

Campo o campos de tipo geo indexados para búsqueda.

relation

enum

Relación de la geometría de la forma del query con la geometría del campo indexado. El valor puede ser uno de los siguientes:

  • contains - Indica que la geometría indexada contiene la geometría query.

  • disjoint - Indica que tanto la query como las geometrías indexadas no tienen nada en común.

  • intersects - Indica que tanto la query como las geometrías indexadas se intersecan.

  • within - Indica que la geometría indexada está dentro de la geometría de la query. No se puede usar within con LineString o Point.

score

Objeto

Puntuación para asignar a los resultados de búsqueda coincidentes. Por defecto, la puntuación en los resultados es 1. Puedes modificar la puntuación utilizando las siguientes opciones:

  • boostMultiplica la puntuación resultante por el número dado.

  • constant: reemplazar la puntuación del resultado por el número dado.

  • function: reemplaza el resultado de la puntuación con la expresión dada.

Para obtener información sobre cómo usar score en tu query, consulta Calificación de los Documentos en los Resultados.

no

Los siguientes ejemplos utilizan la colección listingsAndReviews en la base de datos sample_airbnb. Si tienes el conjunto de datos de muestra en el clúster, puedes crear un índice personalizado de MongoDB Search para el tipo geo y ejecutar las consultas de ejemplo en el clúster. La Guía rápida de MongoDB Search contiene instrucciones para cargar el conjunto de datos de muestra, crear una definición de índice y ejecutar consultas en MongoDB Search.

La siguiente es una definición de índice de muestra para la indexación del 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}

El siguiente ejemplo utiliza el operador geoShape para buscar propiedades que no tengan nada en común con las coordenadas especificadas de longitud y latitud en Hawái.

La query incluye lo siguiente:

  • $limit etapa para limitar la salida a 3 resultados.

  • Etapa $project para excluir todos los campos excepto name y address.

1db.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
}
}
}

El siguiente ejemplo utiliza el operador geoShape para buscar propiedades que se cruzan con las coordenadas de longitud y latitud especificadas en España.

La query incluye lo siguiente:

  • $limit etapa para limitar la salida a 3 resultados.

  • Etapa $project para excluir todos los campos excepto name y address.

1db.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
}
}
}

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. Las consultas buscan el campo address.location en la colección listingsAndReviews en la base de datos sample_airbnb.

La query incluye lo siguiente:

  • $limit etapa para limitar la salida a 3 resultados.

  • Etapa $project para excluir todos los campos excepto name y address.

La siguiente query devuelve los documentos que coinciden con los criterios de búsqueda especificados.

1db.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
}

La siguiente query devuelve el número de tipos de propiedades (como departamento, casa, etc.) para los criterios de búsqueda especificados.

1db.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 query muestran los diferentes tipos de propiedades en las coordenadas especificadas.