Definição
$geoWithinSeleciona documentos com dados geoespaciais que existem inteiramente dentro de uma forma especificada.
The specified shape can be either a GeoJSON
Polygon(either single-ringed or multi-ringed), a GeoJSONMultiPolygon, or a shape defined by legacy coordinate pairs. The$geoWithinoperator uses the$geometryoperator to specify the GeoJSON object.Para especificar um polígono ou vários polígonos GeoJSON utilizando o sistema de referência de coordenadas padrão (CRS), utilize a seguinte sintaxe:
{ <location field>: { $geoWithin: { $geometry: { type: <"Polygon" or "MultiPolygon"> , coordinates: [ <coordinates> ] } } } } For
$geoWithinqueries that specify GeoJSON geometries with areas greater than a single hemisphere, the use of the default CRS results in queries for the complementary geometries.Para especificar um polígono GeoJSON com um MongoDB CRS personalizado, utilize o seguinte protótipo que especifica o MongoDB CRS personalizado na expressão
$geometry:{ <location field>: { $geoWithin: { $geometry: { type: "Polygon" , coordinates: [ <coordinates> ], crs: { type: "name", properties: { name: "urn:x-mongodb:crs:strictwinding:EPSG:4326" } } } } } } The custom MongoDB CRS uses a counter-clockwise winding order and allows
$geoWithinto support queries with a single-ringed GeoJSON polygon whose area is greater than or equal to a single hemisphere. If the specified polygon is smaller than a single hemisphere, the behavior of$geoWithinwith the MongoDB CRS is the same as with the default CRS. See also "Big" Polygons.Se estiver consultando a inclusão em uma forma definida por pares de coordenadas legados em um plano, use a seguinte sintaxe:
{ <location field>: { $geoWithin: { <shape operator>: <coordinates> } } } Os operadores de formas disponíveis são:
$center(define um círculo) e$centerSphere(define um círculo em uma esfera).
Importante
Se você utilizar longitude e latitude, especifique coordenadas em ordem de
longitude, latitude.
Comportamento
Índices geoespaciais
$geoWithin não exige um índice geoespacial. No entanto, um índice geoespacial melhorará o desempenho da query. Ambos os índices geoespaciais 2dsphere e 2d $geoWithin suportam.
Resultados não ordenados
The $geoWithin operator does not return sorted results. As such, MongoDB can return $geoWithin queries more quickly than geospatial $near or $nearSphere queries, which sort results.
Degeneração geométrica
$geoWithin não garante que considerará que uma geometria contém sua geometria componente ou outro polígono compartilhando sua geometria componente.
Polígonos "big"
For $geoWithin, if you specify a single-ringed polygon that has an area greater than a single hemisphere, include the custom MongoDB coordinate reference system in the $geometry expression. Otherwise, $geoWithin queries for the complementary geometry. For all other GeoJSON polygons with areas greater than a hemisphere, $geoWithin queries for the complementary geometry.
Exemplos
Dentro de um polígono
O exemplo seguinte seleciona todos os dados loc que existem inteiramente dentro de um GeoJSON Polygon. A área do polígono é menor que a área de um único hemisfério:
db.places.find( { loc: { $geoWithin: { $geometry: { type : "Polygon" , coordinates: [ [ [ 0, 0 ], [ 3, 6 ], [ 6, 1 ], [ 0, 0 ] ] ] } } } } )
Para polígonos anelares únicos com áreas maiores que um único hemisfério, consulte Dentro de um polígono "grande".
Dentro de um polígono "grande"
Para executar query com um polígono GeoJSON de anel único cuja área é maior que um único hemisfério, a expressão $geometry deve especificar o sistema de referência de coordenadas MongoDB personalizado. Por exemplo:
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" } } } } } } )