5.4 $geoWithin

O operador $geoWithin do MongoDB seleciona documentos com dados geoespaciais que se encontram inteiramente dentro de uma forma especificada.

5.4.1 – Usando um polígono (Polygon)

> // Exibir os títulos das páginas dentro
> // do perímetro da Praça da República.
> // (coordenadas em Longitude, Latitude)
> db.pages.find(
...   {
...     coordinates: {
...       $geoWithin: {
...         $geometry: {
...           type : "Polygon" ,
...           coordinates: [
...             [
...               [-43.18818, -22.90452],
...               [-43.18625, -22.90830],
...               [-43.18875, -22.90900],
...               [-43.19007, -22.90758],
...               [-43.19068, -22.90550],
...               [-43.19064, -22.90532],
...               [-43.18818, -22.90452]
...             ]
...           ]
...         }
...       }
...      }
...    },
...    {title: 1, _id: 0}
... ).sort( {title: 1});
{ "title" : "A Aclamação" }
{ "title" : "Aclamação de Dom Pedro I Imperador do Brasil no Campo de Santa Anna no Rio de Janeiro" }
{ "title" : "As fontes em forma de Stella" }
{ "title" : "Campo de Santana" }
{ "title" : "Casamento da Princesa Dona Maria Teresa" }
{ "title" : "Chafariz das Lavadeiras" }
{ "title" : "Jardim da Praça da República" }
{ "title" : "Monumentos da Cidade do Rio de Janeiro" }
{ "title" : "Palacete da Praça da Aclamação" }
{ "title" : "Parques e Áreas Verdes" }
{ "title" : "Praça da República" }
{ "title" : "Praça do Curro" }
>

Veja agora a mesma consulta executada substituindo o campo coordinates pelo campo geometry:

> db.pages.find(
...   {
...     geometry: {
...       $geoWithin: {
...         $geometry: {
...           type : "Polygon" ,
...           coordinates: [
...             [
...               [-43.18818, -22.90452],
...               [-43.18625, -22.90830],
...               [-43.18875, -22.90900],
...               [-43.19007, -22.90758],
...               [-43.19068, -22.90550],
...               [-43.19064, -22.90532],
...               [-43.18818, -22.90452]
...             ]
...           ]
...         }
...       }
...      }
...    },
...    {title: 1, _id: 0}
... ).sort( {title: 1});
{ "title" : "A Aclamação" }
{ "title" : "Aclamação de Dom Pedro I Imperador do Brasil no Campo de Santa Anna no Rio de Janeiro" }
{ "title" : "Campo de Santana" }
{ "title" : "Casamento da Princesa Dona Maria Teresa" }
{ "title" : "Chafariz das Lavadeiras" }
{ "title" : "Jardim da Praça da República" }
{ "title" : "Palacete da Praça da Aclamação" }
{ "title" : "Praça da República" }
{ "title" : "Praça do Curro" }
>

A segunda consulta só retornou as páginas onde todo o objeto se encontra dentro dos limites do polígono, e não apenas um de seus pontos.

5.4.2 – Usando um retângulo ($box)

> // Exibir os títulos das páginas dentro de um
> // retângulo no entorno da Praça da República.
> // (coordenadas em Longitude, Latitude)
> db.pages.find(
...     {coordinates:
...         {$geoWithin:
...             { $box: [
...                 [-43.19068,-22.90550],
...                 [-43.18625,-22.90830]
...             ] }
...         }
...     },
...     {title: 1, _id: 0}
... ).sort( {title: 1});
{ "title" : "A Aclamação" }
{ "title" : "Aclamação de Dom Pedro I Imperador do Brasil no Campo de Santa Anna no Rio de Janeiro" }
{ "title" : "As fontes em forma de Stella" }
{ "title" : "Campo de Santana" }
{ "title" : "Casamento da Princesa Dona Maria Teresa" }
{ "title" : "Exposições Nacionais" }
{ "title" : "Jardim da Praça da República" }
{ "title" : "Monumentos da Cidade do Rio de Janeiro" }
{ "title" : "Palacete da Praça da Aclamação" }
{ "title" : "Parques e Áreas Verdes" }
{ "title" : "Paço do Senado" }
{ "title" : "Praça da República" }
{ "title" : "Praça do Curro" }
{ "title" : "Rua Detrás do Hospício" }
{ "title" : "Rua Senhor dos Passos" }
{ "title" : "Rua dos Ciganos" }
{ "title" : "Solar do Conde dos Arcos" }
>

Veja agora a mesma consulta executada substituindo o campo coordinates pelo campo geometry:

> db.pages.find(
...     {geometry:
...         {$geoWithin:
...             { $box: [
...                 [-43.19068,-22.90550],
...                 [-43.18625,-22.90830]
...             ] }
...         }
...     },
...     {title: 1, _id: 0}
... ).sort( {title: 1});
{ "title" : "A Aclamação" }
{ "title" : "Aclamação de Dom Pedro I Imperador do Brasil no Campo de Santa Anna no Rio de Janeiro" }
{ "title" : "Campo de Santana" }
{ "title" : "Casamento da Princesa Dona Maria Teresa" }
{ "title" : "Exposições Nacionais" }
{ "title" : "Jardim da Praça da República" }
{ "title" : "Palacete da Praça da Aclamação" }
{ "title" : "Praça da República" }
{ "title" : "Praça do Curro" }
>

A segunda consulta só retornou as páginas onde todo o objeto se encontra dentro dos limites do retângulo, e não apenas um de seus pontos.

5. Consultas geoespaciais