5.4 Geospatial query operator $geoWithin

The operator $geoWithin selects documents with geospatial data that exists entirely within a specified shape.

5.4.1 – Using a polygon

> // Display titles of documents within the
> // perimeter of Praça da República.
> // (Coordinates in 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" }
>

Now the same query executed replacing the field coordinates by 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" }
>

The second query returned only the pages where the entire object is within the boundaries of the polygon, not just one of its points.

5.4.2 – Using a rectangle ($box)

> // Display titles of documents within a
> // rectangle around Praça da República.
> // (Coordinates in 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" }
>

Now the same query executed replacing the field coordinates by 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" }
>

The second query returned only the pages where the entire object is within the boundaries of the box, not just one of its points.

5. Geospatial queries