You can query for location data within a circle on the surface of a sphere. Use these queries to return data within a spherical cap.
To query for location data within a circle on a sphere, use $geoWithin with the $centerSphere operator. In the $centerSphere operator, specify the coordinates and radius of the circle to query within:
db.<collection>.find( { <location field> : { $geoWithin : { $centerSphere: [ [ <longitude>, <latitude> ], <radius> ] } } } )
About this Task
When you specify longitude and latitude coordinates, list the longitude first, and then latitude.
Valid longitude values are between
-180and180, both inclusive.Valid latitude values are between
-90and90, both inclusive.
In the
$centerSphereoperator, specify the circle's radius in radians. To convert other units to and from radians, see Convert Distance to Radians for Spherical Operators.- This example calculates distance in kilometers. To convert kilometers to radians, divide the kilometer value by
6378.1.
$geoWithindoes not require a geospatial index. However, a geospatial index improves query performance. Only the 2dsphere geospatial index supports$geoWithin. For more information see Create a 2dsphere Index.
Before You Begin
Create a places collection that contains these documents:
db.places.insertMany( [ { loc: { type: "Point", coordinates: [ -73.97, 40.77 ] }, name: "Central Park", category : "Park" }, { loc: { type: "Point", coordinates: [ -73.88, 40.78 ] }, name: "La Guardia Airport", category: "Airport" }, { loc: { type: "Point", coordinates: [ -1.83, 51.18 ] }, name: "Stonehenge", category : "Monument" } ] )
Procedure
To query the collection, use $geoWithin with the $centerSphere operator:
db.places.find( { loc: { $geoWithin: { $centerSphere: [ [ -1.76, 51.16 ], 10 / 6378.1 ] } } } )
The query returns documents where the loc field is within a 10 kilometer radius of a point at longitude -1.76, latitude 51.16.
Output:
[ { _id: ObjectId("63fd205e4a08b5e248c03e32"), loc: { type: 'Point', coordinates: [ -1.83, 51.18 ] }, name: 'Stonehenge', category: 'Monument' } ]