Skip to content

Repository files navigation

MongoEngine

Info:MongoEngine is an ORM-like layer on top of PyMongo.
Repository:https://github.com/MongoEngine/mongoengine
Author: Harry Marr (https://github.com/hmarr)
Maintainer:Bastien Gerard (https://github.com/bagerard)
https://github.com/MongoEngine/mongoengine/actions/workflows/github-actions.yml/badge.svg?branch=master https://coveralls.io/repos/github/MongoEngine/mongoengine/badge.svg?branch=master https://pepy.tech/badge/mongoengine/month https://readthedocs.org/projects/mongoengine-odm/badge/?version=latest

⚠️ Warning: mongoengine.org is no longer controlled by the MongoEngine project and appears to be an expired domain takeover. The official MongoEngine project is maintained on GitHub and documented on Read the Docs.

About

MongoEngine is a Python Object-Document Mapper for working with MongoDB. Documentation is available at https://mongoengine-odm.readthedocs.io - there is currently a tutorial, a user guide, and an API reference.

Supported MongoDB Versions

MongoEngine is currently tested against MongoDB v4.4, v5.0, v6.0, v7.0 and v8.0. Future versions should be supported as well, but aren't actively tested at the moment. Make sure to open an issue or submit a pull request if you experience any problems with more recent MongoDB versions.

Installation

MongoEngine requires Python 3.10 or newer. Install it from PyPI with:

$ python -m pip install -U mongoengine

To install a source checkout, run python -m pip install . from the repository root.

Dependencies

MongoEngine requires:

  • PyMongo >=3.12,<5.0

The following optional packages enable additional functionality:

If you utilize a DateTimeField, you might also use a more flexible date parser:

  • python-dateutil >=2.1.0

If you need to use an ImageField or ImageGridFsProxy:

  • Pillow>=7.0.0

If you need to use signals:

  • blinker>=1.3

Examples

Some simple examples of what MongoEngine code looks like:

import datetime
from mongoengine import *

connect('mydb')

class BlogPost(Document):
    title = StringField(required=True, max_length=200)
    posted = DateTimeField(default=lambda: datetime.datetime.now(datetime.timezone.utc))
    tags = ListField(StringField(max_length=50))
    meta = {'allow_inheritance': True}

class TextPost(BlogPost):
    content = StringField(required=True)

class LinkPost(BlogPost):
    url = StringField(required=True)

# Create a text-based post
>>> post1 = TextPost(title='Using MongoEngine', content='See the tutorial')
>>> post1.tags = ['mongodb', 'mongoengine']
>>> post1.save()

# Create a link-based post
>>> post2 = LinkPost(title='Example Docs', url='https://example.com/')
>>> post2.tags = ['mongoengine', 'documentation']
>>> post2.save()

# Iterate over all posts using the BlogPost superclass
>>> for post in BlogPost.objects:
...     print('===', post.title, '===')
...     if isinstance(post, TextPost):
...         print(post.content)
...     elif isinstance(post, LinkPost):
...         print('Link:', post.url)
...

# Count all blog posts and their subtypes
>>> BlogPost.objects.count()
2
>>> TextPost.objects.count()
1
>>> LinkPost.objects.count()
1

# Count tagged posts
>>> BlogPost.objects(tags='mongoengine').count()
2
>>> BlogPost.objects(tags='mongodb').count()
1

Tests

To run the test suite, ensure MongoDB is running on the standard port, then install the package with its test dependencies and run pytest:

$ python -m pip install -e ".[test]"
$ pytest tests/

To run the test suite on every supported Python and PyMongo version, you can use tox. You'll need to make sure you have each supported Python version installed in your environment and then:

# Install tox
$ python -m pip install tox
# Run the test suites
$ tox

Community

Contributing

We welcome contributions! See the Contribution guidelines

About

A Python Object-Document-Mapper for working with MongoDB

Topics

Resources

Contributing

Stars

4.3k stars

Watchers

132 watching

Forks

Releases

Packages

Used by

Contributors

Languages