Definición
$geoWithinSelecciona documentos con datos geoespaciales que existan completamente dentro de una forma especificada.
La forma especificada puede ser un objeto GeoJSON
Polygon(ya sea de un solo anillo o de varios), un objeto GeoJSONMultiPolygono una forma definida por pares de coordenadas heredados. El operador$geoWithinutiliza el operador$geometrypara especificar el objeto GeoJSON.Para especificar GeoJSON polígonos o poligonales múltiples usando el sistema de referencia de coordenadas (CRS) por defecto, usa la siguiente sintaxis:
{ <location field>: { $geoWithin: { $geometry: { type: <"Polygon" or "MultiPolygon"> , coordinates: [ <coordinates> ] } } } } Para las consultas
$geoWithinque especifican geometrías GeoJSON con áreas mayores que un solo hemisferio, el uso del CRS predeterminado da como resultado consultas para las geometrías complementarias.Para especificar un polígono GeoJSON de un solo anillo con un CRS personalizado de MongoDB, utilizar el siguiente prototipo que especifica el CRS personalizado de MongoDB en la expresión
$geometry.{ <location field>: { $geoWithin: { $geometry: { type: "Polygon" , coordinates: [ <coordinates> ], crs: { type: "name", properties: { name: "urn:x-mongodb:crs:strictwinding:EPSG:4326" } } } } } } El sistema de coordenadas de referencia (CRS) personalizado de MongoDB utiliza un orden de enrollado en sentido contrario a las agujas del reloj y permite que
$geoWithinadmita consultas con un polígono GeoJSON de un solo anillo cuya área sea mayor o igual a un hemisferio. Si el polígono especificado es menor que un hemisferio, el comportamiento de$geoWithincon el CRS de MongoDB es el mismo que con el CRS predeterminado. Véase también Polígonos "grandes".Si se consulta para inclusión en una forma definida por legacy coordinate pairs en un plano, utiliza la siguiente sintaxis:
{ <location field>: { $geoWithin: { <shape operator>: <coordinates> } } } Los operadores de forma disponibles son:
$center(define un círculo), y$centerSphere(define un círculo en una esfera).
Importante
Si se utiliza la longitud y la latitud, se deben especificar las coordenadas en orden de
longitude, latitude.
Comportamiento
Índices geoespaciales
$geoWithin no requiere un índice geoespacial. Sin embargo, un índice geoespacial mejorará el rendimiento de las consultas. Tanto los índices geoespaciales 2dsphere como 2d admiten $geoWithin.
Resultados no ordenados
El operador $geoWithin no devuelve resultados ordenados. Por lo tanto, MongoDB puede devolver consultas $geoWithin más rápidamente que consultas geoespaciales $near o $nearSphere, que ordenan los resultados.
Geometría degenerada
$geoWithin no garantiza que considerará que una pieza de geometría contiene su geometría componente, o que otro polígono que comparte su geometría componente.
" Grandes polígonos "
Para $geoWithin, si especifica un polígono de un solo anillo con un área mayor que un hemisferio, incluya el sistema de referencia de coordenadas personalizado de MongoDB en la expresión $geometry. De lo contrario, $geoWithin consulta la geometría complementaria. Para todos los demás polígonos GeoJSON con áreas mayores que un hemisferio, $geoWithin consulta la geometría complementaria.
Ejemplos
Dentro de un polígono
El siguiente ejemplo selecciona todos los datos de loc que existen completamente dentro de un GeoJSON Polygon. El área del polígono es menor que el área de un único hemisferio:
db.places.find( { loc: { $geoWithin: { $geometry: { type : "Polygon" , coordinates: [ [ [ 0, 0 ], [ 3, 6 ], [ 6, 1 ], [ 0, 0 ] ] ] } } } } )
Para polígonos de un solo anillo con áreas mayores que un solo hemisferio, consulte Dentro de un polígono "grande".
Dentro de un polígono "grande"
Para query con un polígono GeoJSON de un solo anillo cuyo área sea mayor que la de un solo hemisferio, la expresión $geometry debe especificar el sistema de referencia de coordenadas personalizado de MongoDB. Por ejemplo:
db.places.find( { loc: { $geoWithin: { $geometry: { type : "Polygon" , coordinates: [ [ [ -100, 60 ], [ -100, 0 ], [ -100, -60 ], [ 100, -60 ], [ 100, 60 ], [ -100, 60 ] ] ], crs: { type: "name", properties: { name: "urn:x-mongodb:crs:strictwinding:EPSG:4326" } } } } } } )