Definition
$geoNearOutputs documents in order of nearest to farthest from a specified point.
Note
The
$geoNearstage has the following prototype form:{ $geoNear: { <geoNear options> } } The
$geoNearoperator accepts a document that contains the following$geoNearoptions. Specify all distances in the same units as those of the processed documents' coordinate system:FieldTypeDescriptiondistanceFieldstring
The output field that contains the calculated distance. To specify a field within an embedded document, use dot notation.
distanceMultipliernumber
Optional. The factor to multiply all distances returned by the query. For example, use the
distanceMultiplierto convert radians, as returned by a spherical query, to kilometers by multiplying by the radius of the Earth.includeLocsstring
Optional. This specifies the output field that identifies the location used to calculate the distance. This option is useful when a location field contains multiple locations. To specify a field within an embedded document, use dot notation.
keyOptional. Specify the geospatial indexed field to use when calculating the distance.
If your collection has multiple
2dand/or multiple2dsphereindexes, you must use thekeyoption to specify the indexed field path to use. Specify Which Geospatial Index to Use provides a full example.If there is more than one
2dindex or more than one2dsphereindex and you do not specify akey, MongoDB will return an error.If you do not specify the
key, and you have at most only one2dindex and/or only one2dsphereindex, MongoDB looks first for a2dindex to use. If a2dindex does not exists, then MongoDB looks for a2dsphereindex to use.maxDistancenumber
Optional. The maximum distance from the center point that the documents can be. MongoDB limits the results to those documents that fall within the specified distance from the center point.
Specify the distance in meters if the specified point is GeoJSON and in radians if the specified point is legacy coordinate pairs.
minDistancenumber
Optional. The minimum distance from the center point that the documents can be. MongoDB limits the results to those documents that fall outside the specified distance from the center point.
Specify the distance in meters for GeoJSON data and in radians for legacy coordinate pairs.
New in version 3.2.
nearGeoJSON point or legacy coordinate pair
querydocument
Optional. Limits the results to the documents that match the query. The query syntax is the usual MongoDB read operation query syntax.
You cannot specify a
$nearpredicate in thequeryfield of the$geoNearstage.sphericalboolean
Optional. Determines how MongoDB calculates the distance between two points:
When
true, MongoDB uses$nearSpheresemantics and calculates distances using spherical geometry.When
false, MongoDB uses$nearsemantics: spherical geometry for 2dsphere indexes and planar geometry for 2d indexes.
Default: false.
Behavior
When using $geoNear, consider that:
You can only use
$geoNearas the first stage of a pipeline.You must include the
distanceFieldoption. ThedistanceFieldoption specifies the field that will contain the calculated distance.$geoNearrequires a geospatial index.If you have more than one geospatial index on the collection, use the
keysparameter to specify which field to use in the calculation. If you have only one geospatial index,$geoNearimplicitly uses the indexed field for the calculation.
Examples
Create a collection places with the following documents:
db.places.insertMany( [ { name: "Central Park", location: { type: "Point", coordinates: [ -73.97, 40.77 ] }, category: "Parks" }, { name: "Sara D. Roosevelt Park", location: { type: "Point", coordinates: [ -73.9928, 40.7193 ] }, category: "Parks" }, { name: "Polo Grounds", location: { type: "Point", coordinates: [ -73.9375, 40.8303 ] }, category: "Stadiums" } ] )
The following operation creates a 2dsphere index on the
location field:
db.places.createIndex( { location: "2dsphere" } )
Maximum Distance
Note
The places collection above has a 2dsphere index.
The following aggregation uses $geoNear to find documents
with a location at most 2 meters from the center
[ -73.99279 , 40.719296 ] and category equal to Parks.
db.places.aggregate([ { $geoNear: { near: { type: "Point", coordinates: [ -73.99279 , 40.719296 ] }, distanceField: "dist.calculated", maxDistance: 2, query: { category: "Parks" }, includeLocs: "dist.location", spherical: true } } ])
The aggregation returns the following:
{ "_id" : 8, "name" : "Sara D. Roosevelt Park", "category" : "Parks", "location" : { "type" : "Point", "coordinates" : [ -73.9928, 40.7193 ] }, "dist" : { "calculated" : 0.9539931676365992, "location" : { "type" : "Point", "coordinates" : [ -73.9928, 40.7193 ] } } }
The matching document contains two new fields:
dist.calculatedfield that contains the calculated distance, anddist.locationfield that contains the location used in the calculation.
Minimum Distance
Note
The following example uses the option minDistance to specify
the minimum distance from the center point that the documents can be.
The following aggregation finds all documents that
db.places.aggregate([ { $geoNear: { near: { type: "Point", coordinates: [ -73.99279 , 40.719296 ] }, distanceField: "dist.calculated", minDistance: 2, query: { category: "Parks" }, includeLocs: "dist.location", spherical: true } } ])
Specify Which Geospatial Index to Use
Consider a places collection that has a 2dsphere index on the location field and a
2d index on the legacy field.
A document in the places collection resembles the following:
{ "_id" : 3, "name" : "Polo Grounds", "location": { "type" : "Point", "coordinates" : [ -73.9375, 40.8303 ] }, "legacy" : [ -73.9375, 40.8303 ], "category" : "Stadiums" }
The following example uses the key option to specify that the
aggregation should use the location field values for the
$geoNear operation rather than the legacy field values.
The pipeline also uses $limit to return at most 5 documents.
Note
db.places.aggregate([ { $geoNear: { near: { type: "Point", coordinates: [ -73.98142 , 40.71782 ] }, key: "location", distanceField: "dist.calculated", query: { "category": "Parks" } } }, { $limit: 5 } ])
The aggregation returns the following:
{ "_id" : 8, "name" : "Sara D. Roosevelt Park", "location" : { "type" : "Point", "coordinates" : [ -73.9928, 40.7193 ] }, "category" : "Parks", "dist" : { "calculated" : 974.175764916902 } } { "_id" : 1, "name" : "Central Park", "location" : { "type" : "Point", "coordinates" : [ -73.97, 40.77 ] }, "legacy" : [ -73.97, 40.77 ], "category" : "Parks", "dist" : { "calculated" : 5887.92792958097 } }