MongoDB ORM for Python?

MongoDB ORM for Python?

Another option is MongoEngine. The ORM for MongoEngine is very similar to the ORM used by Django.

Example (from the tutorial):

class Post(Document):
    title = StringField(max_length=120, required=True)
    author = ReferenceField(User)

class TextPost(Post):
    content = StringField()

class ImagePost(Post):
    image_path = StringField()

class LinkPost(Post):
    link_url = StringField()

Not being satisfied with either MongoKit or MongoEngine, I decided to write my own object-oriented interface for Python.

I delegated all queries directly to pymongo, so the query syntax there is the same. Mostly, its just an object-wrapper around the results, with some other helpers like database connection pooling, DBRef support, and other convenience methods to make your life easier.

Its called Minimongo and its available from github. Happy hacking!


from minimongo import Model, MongoCollection 

class MyObject(Model): 
    model = MongoCollection(database=test, collection=my_collection)

m = MyObject()
m.x = 1
m.field = value
m.other = {list: True}

x = MyObject({x: 1, y: 2}).save()

objs = MyObject.find({x: 1})
for o in objs: 
    print o

MongoDB ORM for Python?

You want MongoKit. It is one layer of abstraction higher than PyMongo. Not sure if youre using Django, but theres also django-mongokit integration.

Example from this blog post. Note that instances of Computer can then reference make/model directly once the structure is defined ( e.g. atari.make, c64.model, … ). No need for dictionaries:

import datetime 
from mongokit import Document

class Computer(Document):

    structure = { 
      make: unicode, 
      model: unicode, 
      purchase_date: datetime.datetime, 
      cpu_ghz: float, 

    validators = { 
      cpu_ghz: lambda x: x > 0, 
      make: lambda x: x.strip(), 

    default_values = { 
      purchase_date: datetime.datetime.utcnow, 

    use_dot_notation = True

    indexes = [ 
      {fields: [make]}, 

Leave a Reply

Your email address will not be published. Required fields are marked *