Skip to main content

A scaling-centric MongoDB object document mapper

Project description

Author:

Allan Caffee <allan.caffee@gmail.com>

About

The ScalyMongo package is a set of tools to simplify the development of large scale distributed software utilizing MongoDB.

Project Status

ScalyMongo is still in Pre-Alpha development and is not yet ready to be deployed in the wild.

Key Priciples

ScalyMongo is intended to help developers in the following ways:

  • scalability: ScalyMongo makes it easy to write software intended to work efficiently on sharded MongoDB deployments. Internal checks warn developers when their queries or inserts are liable to perform poorly on sharded collections.

  • simplicity: ScalyMongo makes interacting with your documents easier by providing a simple Python-friendly document interface.

  • flexibility: ScalyMongo doesn’t try to be everything for everyone. Where necessary users can interact directly with the underlying PyMongo driver.

Getting Started

Below is simple example of a sharded collection of blog posts

>>> from scalymongo import Document, Connection
>>> class BlogPost(Document):
...     structure = {
...        'author': basestring,
...        'title': basestring,
...        'body': basestring,
...        'unique_views': int,
...        'comments': [{
...            'author': basestring,
...            'comment': basestring,
...            'rank': int,
...        }],
...     }
...     indexes = [{
...         'fields': ['author', 'title'],
...         'shard_key': True,
...         'unique': True,
...     }]
...     __database__ = 'blog'
...     __collection__ = 'blog_posts'
...

The example above describes the structure for a blog post. Notice that we declared a unique index on the author and title fields. The index hasn’t actually been created yet, but knowing what indexes exist allow ScalyMongo to warn you about potentially poor choices in queries. Also notice that we declared this index to be used as the shard key.

Now that we’ve got a simple document class let’s create a sample post.

>>> conn = Connection("localhost", 27017)
>>> post = conn.models.BlogPost()
>>> post['author'] = 'Allan'
>>> post['title'] = 'My first post'
>>> post['body'] = "Well, I don't actually have anything to write about..."
>>> post.save()

Great! Now we’ve got our first blog post. Now let’s look Allan’s post up to make sure it was really saved.

>>> conn.models.BlogPost.find_one({'author': 'Allan'})
Traceback (most recent call last):
  ...
scalymongo.errors.GlobalQueryException: Some or all of the shard key was not specified.  Missing fields were title.

What happended!? Remember that we declared a shard key on the author and title fields? ScalyMongo noticed that we trying to query without having the full shard key. This means that the query might potentially have to hit every shard in our cluster to find the one document we were looking for. That’s probably not what we wanted to do, and it certainly wouldn’t be something we would want to occur on a regular basis in a production cluster. Let’s refine our query a bit so that it doesn’t hit every shard.

>>> conn.models.BlogPost.find_one({'author': 'Allan', 'title': 'My first post'})
{u'_id': ObjectId('4deb90e41717953527000000'),
 u'author': u'Allan',
 u'body': u"Well, I don't actually have anything to write about...",
 u'title': u'My first post'}

And sure enough that’s our first post. Of course sometimes we really do want to find something even if we don’t have the full shard key. Sometimes this is useful during development to look up documents from the interactive console. We can just override ScalyMongo’s recomendations and force the query anyway:

>>> conn.models.BlogPost.find_one({'author': 'Allan'}, allow_global=True)
{u'_id': ObjectId('4deb90e41717953527000000'),
 u'author': u'Allan',
 u'body': u"Well, I don't actually have anything to write about...",
 u'title': u'My first post'}

Take that best practices!

Well that’s it for our basic overview of ScalyMongo. Coming soon is a more in-depth introduction.

Special Thanks

ScalyMongo was heavily influenced by the semantics and interface of the popular database framework MongoKit. Special thanks go to Namlook and all of the developers who have contributed to MongoKit.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

scalymongo-0.1.7.tar.gz (15.2 kB view details)

Uploaded Source

File details

Details for the file scalymongo-0.1.7.tar.gz.

File metadata

  • Download URL: scalymongo-0.1.7.tar.gz
  • Upload date:
  • Size: 15.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for scalymongo-0.1.7.tar.gz
Algorithm Hash digest
SHA256 9e7b29d56b9a82bee2956e69bca46d69e52336fc9e35bc8fa6d82edfdd0e790b
MD5 8e49e740131bcdbb0ab63d0e1c9db165
BLAKE2b-256 0e4e231e7ee2a5f859a4d77f66434d8a799ff2c131ed8cce0b30e5831137ee48

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page