GEOLOCATION IN MONGODB { name: ‘Shashank Tiwari’, web: ‘shanky.org’} Wednesday, January 16, 13
Jan 15, 2015
WHO AM I?
Entrepreneur, developer, author
Most recent book: Professional NoSQL (Wiley, 2011)
Founder : WhatNext Labs, creators of
Wednesday, January 16, 13
MONGO DOC WITH LOC
{ loc : [37.407202, -122.10716] }
{ loc : { x: 37.407202, y: -122.10716} }
{ loc : { lat: 37.407202, lon: -122.10716} }
Wednesday, January 16, 13
INDEX
db.places.ensureIndex( { loc : "2d" } )
1 geospatial index per collection
Wednesday, January 16, 13
INDEX RANGE
db.places.ensureIndex( { loc : "2d" } , { min : -500 , max : 500 } )
Wednesday, January 16, 13
INDEX PRECISION
db.places.ensureIndex( { loc : "2d" } , { bits : 26 } )
Geo-hash precision of 26bits ~ 2 feet
Wednesday, January 16, 13
EXACT QUERIES
> db.places.find({ loc : [ 37.407202, -122.10716 ]});
{ "_id" : ObjectId("50b69e66e6945f62a019f3a4"), "name" : "San Antonio Caltrain", "loc" : [ 37.407202, -122.10716 ] }
Wednesday, January 16, 13
EXPLAIN QUERY PLAN
db.places.find({ loc : [ 37.407202, -122.10716 ]}).explain();
Wednesday, January 16, 13
NEAR QUERY
db.places.find({ loc : { $near : [ 37.407202, -122.10716 ]}});
Returns points sorted by distance
Wednesday, January 16, 13
WITH MAXDISTANCE
db.places.find({ loc : { $near : [ 37.407202, -122.10716 ], $maxDistance : 0.05}});
What is the unit of maxDistance? -- for latitude & longitude 1 degree ~ 69 miles
Wednesday, January 16, 13
GEONEAR QUERY
db.runCommand({ geoNear : "places", near : [37.407202, -122.10716], num : 5 });
also gives the distance
Wednesday, January 16, 13
MORE WITH GEONEAR
db.runCommand({ geoNear : "places", near : [37.407202, -122.10716], num : 5, type : “DO” });
parameters: near, num, maxDistance, query
Wednesday, January 16, 13
WITHIN A BOX
db.places.find({ loc : { $within : { $box : [[39.589821, -122.438831], [37.485200, -122.228438]] }}});
Wednesday, January 16, 13
WITHIN A CIRCLE
db.places.find({ loc : { $within : { $center : [[39.589821, -122.438831], 10] }}});
Wednesday, January 16, 13
SPHERICAL SUPPORT
geoNear -- spherical : true
$nearSphere
$centerSphere
Order is important, very important -- longitude, latitude
Wednesday, January 16, 13
MULTI LOCATIONS
db.places.insert({ placesVisitedToday : [ { name : "San Antonio Caltrain", loc : [37.407202, -122.10716] }, { name : "Datapipe", loc : [37.3336641, -121.8887072] } ] })
Wednesday, January 16, 13
QUERY MULTI LOC
db.places.ensureIndex( { " placesVisitedToday.loc " : "2d"} )
use uniqueDocs : true to get unique documents
Wednesday, January 16, 13
THANKS
More questions? web: shanky.org | twitter : @tshanky | email: [email protected]
Download and play with on Google Play and coming soon to the AppStore.
Wednesday, January 16, 13