Сергей Матвеенко: mongoengine: noorm for nosql

16
MongoEngine NoORM for NoSQL Serge Matveenko github.com/lig PyCon Russia 2013

Upload: it-people

Post on 11-Nov-2014

1.686 views

Category:

Technology


1 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Сергей Матвеенко: MongoEngine: NoORM for NoSQL

MongoEngineNoORM for NoSQL

Serge Matveenkogithub.com/lig

PyCon Russia 2013

Page 2: Сергей Матвеенко: MongoEngine: NoORM for NoSQL

Quick MongoDB intro

NoSQL document-oriented database

● scalable (auto-sharding, replication)● high-performance (~104-105 queries/sec)● open source (db: AGPL, drivers: Apache)

Page 3: Сергей Матвеенко: MongoEngine: NoORM for NoSQL

RDBMS vs MongoDB

RDBMS MongoDB

data DB + Driver DB + PyMongo

aggregation

constraints Application

validation

cascade updates

business logic Application

Page 4: Сергей Матвеенко: MongoEngine: NoORM for NoSQL

RDBMS vs MongoDB

RDBMS MongoDB

data DB + Driver DB + PyMongo

aggregation

constraints MongoEngine

validation

cascade updates

business logic Application Application

Page 5: Сергей Матвеенко: MongoEngine: NoORM for NoSQL

MongoEngine class CharacterName(EmbeddedDocument): first = StringField() last = StringField() class Character(Document): name = EmbeddedDocumentField(CharacterName) rating = IntField()

MongoDB {"_id" : ObjectId

("5125e0ee98764119e77d9b1f"),"_types" : ["Character"],"rating" : 42,"name" : {"_types" : ["CharacterName"],

"last": "Connor", "_cls": "CharacterName", "first": "Sarah"},

"_cls": "Character"}

How it looks

Page 6: Сергей Матвеенко: MongoEngine: NoORM for NoSQL

MongoEngine class CharacterName(EmbeddedDocument): first = StringField() last = StringField() class Character(Document): name = EmbeddedDocumentField(CharacterName) rating = IntField()

MongoDB {"_id" : ObjectId

("5125e0ee98764119e77d9b1f"),"rating" : 42,"name" : {"last": "Connor",

"_cls": "CharacterName", "first": "Sarah"},"_cls": "Character"

}

How it looks(MongoEngine 0.8)

Page 7: Сергей Матвеенко: MongoEngine: NoORM for NoSQL

Simple

db.character.find({'name.first': 'John'})Character.objects(name__first='John')

db.character.find({rating: {$gte: 42}}).limit(5)Character.objects(rating__gte=42)[:5]

db.character.find({rating: {$exists: false}})Character.objects(rating__exists=False)

Querying with MongoEngine

Page 8: Сергей Матвеенко: MongoEngine: NoORM for NoSQL

Map/Reduce

db.character.mapReduce(map_f, reduce_f, {out: 'mr_col'});db.mr_col.find();

Character.objects.map_reduce(map_f, reduce_f, 'mr_col')

Querying with MongoEngine

Page 9: Сергей Матвеенко: MongoEngine: NoORM for NoSQL

Creating

db.character.save( {name: {first: 'John', last: 'Conor'}, rating: 42})

jc = Character( name=CharacterName(first='John', last='Conor'), rating=42)jc.save()

Updating with MongoEngine

Page 10: Сергей Матвеенко: MongoEngine: NoORM for NoSQL

Atomic updates

db.character.update( {name: {first: "John", last: "Conor"}}, {$set: {"name.last": "Connor"}})

Character.objects( name=CharacterName(first='John', last='Conor')).update(set__name__last='Connor')

Updating with MongoEngine

Page 11: Сергей Матвеенко: MongoEngine: NoORM for NoSQL

Under the hood

MongoDB "C" BSONModule PyMongo MongoEngine

JavaScriptConsole

Binary data

Python native types

Declarative classes

Page 12: Сергей Матвеенко: MongoEngine: NoORM for NoSQL

Under the hood

MongoDB "C" BSONModule PyMongo MongoEngine

JavaScriptConsole

Binary data

Python native types

Declarative classes

Page 13: Сергей Матвеенко: MongoEngine: NoORM for NoSQL

Performance

Page 14: Сергей Матвеенко: MongoEngine: NoORM for NoSQL

Out of the box● authentication backend● session engine● GridFSStorage

Third party● stephrdev/django-mongoforms (Model Forms port)● wpjunior/django-mongotools (forms, generic views)● lig/django-registration-me (django-registration port)

Django integration

Page 15: Сергей Матвеенко: MongoEngine: NoORM for NoSQL

Customizing things(added today. sorry:)

● SequenceField(value_decorator=func)● StringField(regex=r'…')● URLField(verify_exists=True)● …

● Inherit from standard Field classes● Write your own Field classes● Inherit from BaseDocument class,

don't forget metaclass!● Any metamagic your like…

Page 16: Сергей Матвеенко: MongoEngine: NoORM for NoSQL

Questions?

Serge Matveenko (github.com/lig)

mongoengine.orgwww.mongodb.org

Thanks toRoss Lawley (github.com/rozza)

Elena Voronina :)