Database Reference
In-Depth Information
As you can see, this returns only a single result: a restaurant located within 40 kilometers (or, roughly 25 miles)
from the starting point.
■
Note
there is a direct correlation between the number of results returned and the time a given query takes to execute.
In addition to the
$geoNear
operator, MongoDB also includes a
$geoWithin
operator. You use this operator
to find items in a particular shape. At this time, you can find items located in a
$box, $polygon, $center
and
$centerSphere
shape, where
$box
represents a rectangle,
$polygon
represents a specific shape of your choosing,
$center
represents a circle, and
$centerSphere
defines a circle on a sphere. Let's look at a couple of additional
examples that illustrate how to use these shapes.
■
With version 2.4 of MongoDB the
$within
operator was deprecated and replaced by
$geoWithin
. this operator
does not strictly require a geospatial indexing. also, unlike the
$near
operator,
$geoWithin
does not sort the returned
results, improving their performance.
Note
To use the
$box
shape, you first need to specify the lower-left, followed by the upper-right coordinates of the box,
as in the following example:
> db.restaurants.find( { loc: { $geoWithin : { $box : [ [52.368549,4.890238],
[52.368849,4.89094] ] } } } )
Similarly, to find items within a specific polygon form, you need to specify the coordinates of your points as a set
of nested arrays. Again note that the first and last coordinates must be identical to close the shape properly, as shown
in the following example:
> db.restaurants.find( { loc :
{ $geoWithin :
{ $geometry :
{ type : "Polygon" ,
coordinates : [ [
[52.368739,4.890203], [52.368872,4.890477], [52.368726,4.890793],
[52.368608,4.89049], [52.368739,4.890203]
] ]
}
}
} )
The code to find items in a basic
$circle
shape is quite simple. In this case, you need to specify the center of the
circle and its radius, measured in the units used by the coordinate system, before executing the
find()
function:
> db.restaurants.find( { loc: { $geoWithin : { $center : [ [52.370524, 5.217682], 10] } } } )
Note that ever since MongoDB version 2.2.3, the
$center
operator can be used without having a geospatial index
in place. However, it is recommended to create one to improve performance.
Finally, to find items located within a circular shape on a sphere (say, our planet) you can use the
$centerSphere
operator. This operator is similar to
$center
, like so:
> db.restaurants.find( { loc: { $geoWithin : { $centerSphere : [ [52.370524, 5.217682], 10] } } } )