I’m currently playing with MongoDB and its geospatial queries. It’s pretty interesting so far, so I just thought I’d write something up to show how I’m using it with PyMongo!

Firstly, the obvious pip install pymongo is needed. We will need a mongo client first, which is easy enough

from pymongo import MongoClient
 
client = MongoClient()

It’s pretty neat - by default, MongoClient will connect to mongodb://localhost:27017.

You might want to do something like this instead though

url = os.environ.get("MONGO_URL", "mongodb://localhost:27017")
client = MongoClient(url)

We’re going to want to create a MongoDB index on a document field to allow the geospatial magic to work. We will be creating a 2dsphere index.

from pymongo import MongoClient, GEOSPHERE, DESCENDING
 
client = MongoClient()
db = client.foo
db.bar.create_index([("location", GEOSPHERE)])

Now all that is needed is to insert a document and run a query :) We’ll insert a document that just has a location field

db.bar.insert_one({
	“location”: {
		"coordinates" : [ 
			51.4982563, 
			-0.0861183
    		],
    		"type" : "Point"
	}
})

The location field needs to be GeoJSON, which is a JSON standard for representing geographic features. It makes querying for documents super easy!

db.bar.find({
	"location": {
		"$near": {
			"$geometry": {"type": "Point", "coordinates": [LAT, LONG]},
			"$maxDistance": range,
		}
	}
})