geolocation in mongodb

Post on 05-Dec-2014

9.128 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

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

top related