Geospatial Search

You can query against geospatial indexes in several ways via the Node.js driver, using geospatial query operators.

To create a 2dsphere index on a collection, pass a document containing the name of the field to be indexed with the value ‘2dsphere’ to the createIndex() method.

function create2dSphereIndex(db, callback) { // Get the restaurants collection const collection = db.collection('restaurants'); // Create the index collection.createIndex( { 'address.coord' : "2dsphere" }, function(err, result) { console.log(result); callback(result); }); }; const MongoClient = require('mongodb').MongoClient; const assert = require('assert'); // Connection URL const url = 'mongodb://localhost:27017'; // Database Name const dbName = 'myproject'; // Create a new MongoClient const client = new MongoClient(url); // Use connect method to connect to the Server client.connect(function(err, client) { assert.equal(null, err); console.log("Connected correctly to server"); const db = client.db(dbName); create2dSphereIndex(db, function() { client.close(); }); }); 

The following examples assume that a database called test has a collection called restaurants, with a 2d sphere index index on the address.coord field. A sample dataset is available for download.

$near

The $near operator specifies a set of longitude-latitude coordinates and returns documents from nearest to farthest.

function findDocuments(db, callback) { // Get the documents collection const collection = db.collection('restaurants'); // Find some documents collection.find(	{ 'address.coord': { $near : { $geometry: { type: "Point", coordinates: [ -73.9667, 40.78 ] }, $maxDistance: 1000 } }	} ).toArray(function(err, docs) { assert.equal(err, null); console.log("Found the following records"); console.log(docs); callback(docs); }); } // use the findDocuments() function const MongoClient = require('mongodb').MongoClient; const assert = require('assert'); // Connection URL const url = 'mongodb://localhost:27017'; // Database Name const dbName = 'myproject'; const client = new MongoClient(url); // Use connect method to connect to the Server client.connect(function(err, client) { assert.equal(null, err); console.log("Connected correctly to server"); const db = client.db(dbName); findDocuments(db, function() { client.close(); }); }); 

The $maxDistance option specifies a maximum distance (in meters) from the given coordinates. For a complete list of $near options, see the MongoDB manual.

$geoWithin

The $geoWithin operator selects documents with geospatial data that exist within a specified shape.

function findDocuments(db, callback) { // Get the documents collection const collection = db.collection('restaurants'); // Find some documents collection.find( { 'address.coord': { $geoWithin: { $geometry: { type : "Polygon" , coordinates: [ [ [ -73, 40 ], [ -74, 41 ], [ -72, 39 ], [ -73, 40 ] ] ] } } } } ).toArray(function(err, docs) { assert.equal(err, null); console.log("Found the following records"); console.log(docs); callback(docs); }); } // use the findDocuments() function const MongoClient = require('mongodb').MongoClient; const assert = require('assert'); // Connection URL const url = 'mongodb://localhost:27017'; // Database Name const dbName = 'myproject'; const client = new MongoClient(url); // Use connect method to connect to the Server client.connect(function(err, client) { assert.equal(null, err); console.log("Connected correctly to server"); const db = client.db(dbName); findDocuments(db, function() { client.close(); }); });