open-source, high performance,
document-oriented database
no joins + no complex transactions
flexible JSON-style documents
{
"author": "trevor",
"text": "...",
"tags": ["mongodb"]
}
database -> database
table -> collection
row -> document
column -> field
table joins -> embedded documents / linking
primary key -> "_id"
simple 1to1 syntax with mongo console
pip install pymongo
>>> from pymongo import MongoClient
>>> conn = MongoClient()
>>> from datetime import datetime
>>> db = conn.myblog
>>> db.posts.insert({
... "author": "trevor",
... "date": datetime.utcnow(),
... "text": "...",
... "tags": ["mongodb"]
... })
>>> posts = db.posts.find({"author": "trevor"})
>>> from pymongo import DESCENDING
>>> posts = db.posts.find()
... .sort("date", DESCENDING)
... .limit(10)
>>> db.posts.ensure_index("tags")
>>> db.posts.find({"tags": "mongodb"})
>>> db.posts.count()
>>> db.posts.find({"author": "trevor"}).count()
Posts since April
>>> db.posts.find({"date" {"$gt": datetime(2012, 4, 1)}})
$ne
$lt $lte
$gt $gte
$not
$in $nin
$mod
$all
$size
$exists
>>> from pymongo import GEO2D
>>> db.craters.ensure_index("coordinates", GEO2D)
$near
$maxDistance
$within
$center
$box $polygon
>>> db.posts.update({"_id": post["_id"]}, {"$inc": {"views": 1}})
$set $unset
$inc $dec
$pop $push
$addToSet
pip install mongoengine
object-document mapper
simple declarative api, similar to Django ORM
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')