OPTIONS

$near

Definition

$near

Changed in version 2.4.

Specifies a point for which a geospatial query returns the closest documents first. The query sorts the documents from nearest to farthest.

The $near operator can query for a GeoJSON point or for a point defined by legacy coordinate pairs.

The optional $maxDistance operator limits a $near query to return only those documents that fall within a maximum distance of a point. If you query for a GeoJSON point, specify $maxDistance in meters. If you query for legacy coordinate pairs, specify $maxDistance in radians.

Considerations

The $near operator requires a geospatial index: a 2dsphere index for GeoJSON points; a 2d index for legacy coordinate pairs. By default, queries that use a 2d index return a limit of 100 documents; however you may use limit() to change the number of results.

You cannot combine the $near operator, which requires a special geospatial index, with a query operator or command that uses a different type of special index. For example you cannot combine $near with the text command.

For sharded collections, queries using $near are not supported. You can instead use either the geoNear command or the $geoNear aggregation stage.

Behavior

geoNear always returns the documents sorted by distance. Any other sort order requires to sort the documents in memory, which can be inefficient. To return results in a different sort order, use the $geoWithin operator in combination with sort()

Examples

For queries on GeoJSON data, use the following syntax:

db.<collection>.find(
   { <location field> :
       { $near :
          {
            $geometry : {
               type : "Point" ,
               coordinates : [ <longitude> , <latitude> ] },
            $maxDistance : <distance in meters>
          }
       }
    }
)

Important

Specify coordinates in this order: “longitude, latitude.”

The following example selects the documents with coordinates nearest to [ 40 , 5 ] and limits the maximum distance to 500 meters from the specified GeoJSON point:

db.places.find(
   {
     loc:
       { $near :
          {
            $geometry : { type : "Point" , coordinates: [ 40 , 5 ] },
            $maxDistance : 500
          }
       }
   }
)

For queries on legacy coordinate pairs, use the following syntax:

db.<collection>.find( { <location field> :
                         { $near : [ <x> , <y> ] ,
                           $maxDistance: <distance>
                    } } )

Important

If you use longitude and latitude, specify longitude first.

The following example query returns documents with location values that are 10 or fewer units from the point [ 40 , 5 ].

For GeoJSON point object, specify the $maxDistance in meters, not radians.

db.places.find( { loc :
                   { $near : [ 40 , 5 ] ,
                     $maxDistance : 10
                } } )

Note

You can further limit the number of results using cursor.limit().

Specifying a batch size (i.e. batchSize()) in conjunction with queries that use the $near is not defined. See SERVER-5236 for more information.