Python & MongoDB

A Short Introduction

Trevor Olson / @ZombieFeynman

MongoDB

open-source, high performance,
document-oriented database

Non-relational

no joins + no complex transactions

Document Oriented

flexible JSON-style documents

{
  "author": "trevor",
  "text": "...",
  "tags": ["mongodb"]
}

Terminology

database -> database

table -> collection

row -> document

column -> field

table joins -> embedded documents / linking

primary key -> "_id"

The Bad

  • sql
  • queries with business logic
  • transactional queries

Goodies

  • map/reduce
  • capped collections
  • unique indexes
  • GridFS
  • automatic sharding

PyMongo

simple 1to1 syntax with mongo console

pip install pymongo

Connecting


>>> from pymongo import MongoClient
>>> conn = MongoClient()
                    

Inserting


>>> from datetime import datetime
>>> db = conn.myblog
>>> db.posts.insert({
...   "author": "trevor",
...   "date": datetime.utcnow(),
...   "text": "...",
...   "tags": ["mongodb"]
... })
                    

Queries


>>> posts = db.posts.find({"author": "trevor"})
                        

Last 10 Posts


>>> from pymongo import DESCENDING
>>> posts = db.posts.find()
...                 .sort("date", DESCENDING)
...                 .limit(10)
                        

Indexed Lists


>>> db.posts.ensure_index("tags")
>>> db.posts.find({"tags": "mongodb"})
                        

Counting


>>> db.posts.count()
>>> db.posts.find({"author": "trevor"}).count()
                        

Advanced Queries

Posts since April


>>> db.posts.find({"date" {"$gt": datetime(2012, 4, 1)}})
                        

Query Operators

  • $ne
  • $lt $lte
  • $gt $gte
  • $not
  • $in $nin
  • $mod
  • $all
  • $size
  • $exists

Geospatial Queries


>>> from pymongo import GEO2D
>>> db.craters.ensure_index("coordinates", GEO2D)
                        
  • $near
  • $maxDistance
  • $within
  • $center
  • $box $polygon

Atomic Updates


>>> db.posts.update({"_id": post["_id"]}, {"$inc": {"views": 1}})
                        

Update Operators

  • $set $unset
  • $inc $dec
  • $pop $push
  • $addToSet

MongoEngine

pip install mongoengine

object-document mapper
simple declarative api, similar to Django ORM

MongoEngine Example

from mongoengine import *
connect('myblog')

class Post(Document):
    author = StringField(required=True)
    date = DateTimeField(default=datetime.utcnow)
    text = StringField()
    tags = ListField(StringField(max_length=30))

Post(
    author = 'trevor',
    text = '...',
    tags = ['mongoengine']
).save()

Post.objects(author='trevor')
                        

THE END

Trevor Olson / @ZombieFeynman