Definição
$geoWithinSeleciona documentos com dados geoespaciais que existem inteiramente dentro de uma forma especificada.
A forma especificada pode ser GeoJSON (anelar único
Polygonou multianelar), GeoJSON ou uma forma definida porMultiPolygonpares de coordenadas legado . O operador$geoWithinutiliza o operador$geometrypara especificar o objeto GeoJSON.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> ] } } } } Para queries do que especificam geometrias GeoJSON com áreas maiores que um único hemisfério, o uso do CRS padrão resulta em queries para as geometrias
$geoWithincomplementares.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" } } } } } } O CRS personalizado do MongoDB usa uma ordem de enrolamento no sentido anti-horário e permite que suporte
$geoWithinqueries com um polígono GeoJSON de anel único cuja área é maior ou igual a um único hemisfério. Se o polígono especificado for menor que um único hemisfério, o comportamento do$geoWithincom o MongoDB CRS será o mesmo que com o CRS padrão. Veja também "Big" Polígonos.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
O operador$geoWithinnão retorna resultados ordenados. Dessa forma, o MongoDB pode retornar queries$geoWithinmais rapidamente do que as queries geoespaciais$nearou$nearSphere, que ordenam os resultados.
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"
Por$geoWithin, se você especificar um polígono de anel único que tenha uma área maior que um único hemisfério, inclua o sistema de referência de coordenadas personalizado do MongoDB na expressão$geometry. Caso contrário, as queries do$geoWithinpara a geometria complementar. Para todos os outros polígonos GeoJSON com áreas maiores que um hemisfério, $geoWithinqueries para a geometria complementar.
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" } } } } } } )