geolocation in mongodb
DESCRIPTION
Shashank Tiwari goes through the basics of Geolocation queries and indexing in MongoDB.TRANSCRIPT
GEOLOCATION IN MONGODB
{ name: ‘Shashank Tiwari’, web: ‘shanky.org’}
Wednesday, November 28, 12
WHO AM I?
Entrepreneur, developer, author
Most recent book: Professional NoSQL (Wiley, 2011)
Co-founder :
Wednesday, November 28, 12
DEGREES OF MEASURE
Latitude
Longitude
Wednesday, November 28, 12
DEGREE OF LONGITUDE
Wednesday, November 28, 12
GEO IN MONGO
Is a world in 2D
Wednesday, November 28, 12
MONGO DOC WITH LOC
{ loc : [37.407202, -122.10716] }
{ loc : { x: 37.407202, y: -122.10716} }
{ loc : { lat: 37.407202, lon: -122.10716} }
Wednesday, November 28, 12
INDEX
db.places.ensureIndex( { loc : "2d" } )
1 geospatial index per collection
Wednesday, November 28, 12
INDEX RANGE
db.places.ensureIndex( { loc : "2d" } , { min : -500 , max : 500 } )
Wednesday, November 28, 12
INDEX PRECISION
db.places.ensureIndex( { loc : "2d" } , { bits : 26 } )
Geo-hash precision of 26bits ~ 2 feet
Wednesday, November 28, 12
EXACT QUERIES
> db.places.find({ loc : [ 37.407202, -122.10716 ]});
{ "_id" : ObjectId("50b69e66e6945f62a019f3a4"), "name" : "San Antonio Caltrain", "loc" : [ 37.407202, -122.10716 ] }
Wednesday, November 28, 12
EXPLAIN QUERY PLAN
db.places.find({ loc : [ 37.407202, -122.10716 ]}).explain();
Wednesday, November 28, 12
COMPOUND INDEX
db.places.ensureIndex( { loc : "2d", name : 1 } )
Wednesday, November 28, 12
NEAR QUERY
db.places.find({ loc : { $near : [ 37.407202, -122.10716 ]}});
Returns points sorted by distance
Wednesday, November 28, 12
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, November 28, 12
GEONEAR QUERY
db.runCommand({ geoNear : "places", near : [37.407202, -122.10716], num : 5 });
also gives the distance
Wednesday, November 28, 12
MORE WITH GEONEAR
db.runCommand({ geoNear : "places", near : [37.407202, -122.10716], num : 5, type : “DO” });
parameters: near, num, maxDistance, query
Wednesday, November 28, 12
WITHIN A BOX
db.places.find({ loc : { $within : { $box : [[39.589821, -122.438831], [37.485200, -122.228438]] }}});
Wednesday, November 28, 12
WITHIN A CIRCLE
db.places.find({ loc : { $within : { $center : [[39.589821, -122.438831], 10] }}});
Wednesday, November 28, 12
WITHIN A POLYGON
Polygon shapes currently cannot be indexed
Wednesday, November 28, 12
SPHERICAL SUPPORT
geoNear -- spherical : true
$nearSphere
$centerSphere
Order is important, very important -- longitude, latitude
Wednesday, November 28, 12
MULTI LOCATIONS
db.places.insert({ placesVisitedToday : [ { name : "San Antonio Caltrain", loc : [37.407202, -122.10716] }, { name : "Kixeye", loc : [37.7906672, -122.403256] } ] })
Wednesday, November 28, 12
QUERY MULTI LOC
db.places.ensureIndex( { " placesVisitedToday.loc " : "2d"} )
use uniqueDocs : true to get unique documents
Wednesday, November 28, 12
Wednesday, November 28, 12
Wednesday, November 28, 12
NEXT TALK
More details and some about GIS too!
SV MongoDB User Group @ Palo Alto -- January Meetup
Wednesday, November 28, 12
THANKS
More questions? web: shanky.org | twitter : @tshanky
Want to join the alpha program? doaround.com
Wednesday, November 28, 12