Geospatial Queries With Mongoose and Node.js
Geospatial Queries With Mongoose and Node.js
Join the DZone community and get the full member experience.
Join For FreeDownload the Altoros NoSQL Performance Benchmark 2018. Compare top NoSQL solutions – Couchbase Server v5.5, MongoDB v3.6, and DataStax Enterprise v6 (Cassandra).
The following article was written by Javier Manzano
As I’m working on a new website on node.js with MongoDB (with mongoose), I’m just realizing how powerful is this combination. Just amazing.
In one of the new features I was developing I wanted to use geolocation on my searchs.
One of the first things you have to do is to tell mongoose (or MongoDB native driver) that one attribute is going to have a 2D index
var place = new Schema({ ... creationDate: { type: Date, default: Date.now }, userId: ObjectId, username: String, geo: {type: [Number], index: '2d'} ... }); exports.PlaceService = mongoose.model('Place', place);
After that, we can include one method to find near places to the schema
place.methods.findNear = function(cb) { return this.model('Place').find({geo: { $nearSphere: this.geo, $maxDistance: 0.01} }, cb); }
Now, if you’re using express.js, you can define a route in your app.js file (or whatever you call it and just add this function)
exports.nearPlaces = function(req, res) { //I'm just sending the geolocation points in a format like this 39.92,-23 // but you can send it however you want var coord = req.query.geo.split(','); var Place = mongoose.model('Place'); var park = new Place({geo: coord}); place.findNear( function(err,docs) { if (!err) { res.json(docs); } else { throw err; } }); };
As you can see, It’s incredible what you can achieve with just a bunch of lines of code.
I’m falling in love with Node.js!
See you later guys!!!!
Download the whitepaper, Moving From Relational to NoSQL: How to Get Started. We’ll take you step by step through your first NoSQL project.
Published at DZone with permission of Will Soprano . See the original article here.
Opinions expressed by DZone contributors are their own.
{{ parent.title || parent.header.title}}
{{ parent.tldr }}
{{ parent.linkDescription }}
{{ parent.urlSource.name }}