$geoNear (aggregation)
Definition
Note
Starting in version 4.2, MongoDB removes the limit
and num
options for the $geoNear
stage as well as the defaultlimit of 100 documents. To limit the results of$geoNear
, use the $geoNear
stage with the$limit
stage.
The $geoNear
stage has the following prototype form:
- { $geoNear: { <geoNear options> } }
The $geoNear
operator accepts a document thatcontains the following $geoNear
options. Specify alldistances in the same units as those of the processed documents’coordinate system:
FieldTypeDescriptionnear
GeoJSON point or legacy coordinate pairThe point for which to find the closest documents.
If using a 2dsphere index, you can specifythe point as either a GeoJSON point or legacy coordinate pair.
If using a 2d index, specify the point as a legacycoordinate pair.distanceField
stringThe output field that contains thecalculated distance. To specify a field within an embedded document,use dot notation.spherical
booleanOptional. Determines how MongoDB calculates the distance between two points:
- When
true
, MongoDB uses$nearSphere
semantics andcalculates distances using spherical geometry. - When
false
, MongoDB uses$near
semantics:spherical geometry for 2dsphereindexes and planar geometry for 2d indexes.Default: false.maxDistance
numberOptional. The maximum distance from the center point that the documents _can_be. MongoDB limits the results to those documents that fall withinthe specified distance from the center point.
Specify the distance in meters if the specified point isGeoJSON and in radians if the specified point islegacy coordinate pairs.query
documentOptional. Limits the results to the documents that match the query. The querysyntax is the usual MongoDB read operation query syntax.
You cannot specify a $near
predicate in the query
field ofthe $geoNear
stage.distanceMultiplier
numberOptional. The factor to multiply all distances returned by the query. Forexample, use the distanceMultiplier
to convert radians, asreturned by a spherical query, to kilometers by multiplying by theradius of the Earth.includeLocs
stringOptional. This specifies the output field that identifies the location used tocalculate the distance. This option is useful when a location fieldcontains multiple locations. To specify a field within anembedded document, use dot notation.uniqueDocs
booleanOptional. If this value is true
, the query returns a matching document once,even if more than one of the document’s location fields match thequery.
Deprecated since version 2.6: Geospatial queries no longer return duplicate results. The$uniqueDocs
operator has no impact on results.
minDistance
numberOptional. The minimum distance from the center point that the documents canbe. MongoDB limits the results to those documents that fall outsidethe specified distance from the center point.
Specify the distance in meters for GeoJSON data and in radians forlegacy coordinate pairs.
New in version 3.2.
key
Optional. Specify the geospatial indexed field to use when calculating thedistance.
If your collection has multiple 2d
and/or multiple 2dsphere
indexes, you must use the key
option to specify the indexedfield path to use. Specify Which Geospatial Index to Useprovides a full example.
If there is more than one 2d
index or more than one 2dsphere
index and you do not specify a key
, MongoDB will return an error.
If you do not specify the key
, and you have at most only one2d
index and/or only one 2dsphere
index, MongoDB looks firstfor a 2d
index to use. If a 2d
index does not exists, thenMongoDB looks for a 2dsphere
index to use.
New in version 4.0.
Behavior
When using $geoNear
, consider that:
You can only use
$geoNear
as the first stage of apipeline.You must include the
distanceField
option. ThedistanceField
option specifies the field that will containthe calculated distance.$geoNear
requires a geospatial index.
If you have more than one geospatial index on the collection, use thekeys
parameter to specify which field to use in the calculation.If you have only one geospatial index, $geoNear
implicitlyuses the indexed field for the calculation.
- You cannot specify a
$near
predicate in thequery
field ofthe$geoNear
stage. - Views do not support geoNear operations (i.e.
$geoNear
pipeline stage). - Starting in version 4.2,
$geoNear
no longer has a defaultlimit of 100 documents.
Example
Note
Starting in version 4.2, MongoDB removes the limit
and num
options for the $geoNear
stage as well as the defaultlimit of 100 documents. To limit the results of$geoNear
, use the $geoNear
stage with the$limit
stage.
Consider a collection places
that has a 2dsphere
index. Thefollowing aggregation uses $geoNear
to find documents witha 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.calculated
field that contains the calculated distance, anddist.location
field that contains the location used in thecalculation.
Minimum Distance
Note
Starting in version 4.2, MongoDB removes the limit
and num
options for the $geoNear
stage as well as the defaultlimit of 100 documents. To limit the results of$geoNear
, use the $geoNear
stage with the$limit
stage.
The following example uses the option minDistance
to specifythe 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
New in version 4.0.
Consider a places
collection that has a 2dsphere index on the location
field and a2d 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 theaggregation 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
Starting in version 4.2, MongoDB removes the limit
and num
options for the $geoNear
stage as well as the defaultlimit of 100 documents. To limit the results of$geoNear
, use the $geoNear
stage with the$limit
stage.
- 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
- }
- }