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.