Upgrade to Pro — share decks privately, control downloads, hide ads and more …

MongoEngine - NoORM for NoSQL

MongoEngine - NoORM for NoSQL

The talk about MongoEngine presented on PyCon Russia 2013.

200442040b9d038626d92d408f499642?s=128

Serge Matveenko

February 24, 2013
Tweet

Transcript

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

  2. Quick MongoDB intro NoSQL document-oriented database • scalable (auto-sharding, replication)

    • high-performance (~104-105 queries/sec) • open source (db: AGPL, drivers: Apache)
  3. RDBMS vs MongoDB RDBMS MongoDB data DB + Driver DB

    + PyMongo aggregation constraints Application validation cascade updates business logic Application
  4. RDBMS vs MongoDB RDBMS MongoDB data DB + Driver DB

    + PyMongo aggregation constraints MongoEngine validation cascade updates business logic Application Application
  5. 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
  6. 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)
  7. 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
  8. 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
  9. 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
  10. 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
  11. Under the hood MongoDB "C" BSON Module PyMongo MongoEngine JavaScript

    Console Binary data Python native types Declarative classes
  12. Under the hood MongoDB "C" BSON Module PyMongo MongoEngine JavaScript

    Console Binary data Python native types Declarative classes
  13. Performance

  14. 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
  15. 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…
  16. Questions? Serge Matveenko (github.com/lig) mongoengine.org www.mongodb.org Thanks to Ross Lawley

    (github.com/rozza) Elena Voronina :)