| 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) |
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.
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.
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.
MongoEngine requires Python 3.10 or newer. Install it from PyPI with:
$ python -m pip install -U mongoengineTo install a source checkout, run python -m pip install . from the
repository root.
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
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()
1To 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- Ask usage questions on Stack Overflow.
- Report confirmed bugs on GitHub Issues.
We welcome contributions! See the Contribution guidelines