MongoDB 与 MongoEngine

使用 MongoDB 这样的文档数据库是关系型 SQL 数据库的常见替代方案。 本模式展示了如何使用 `MongoEngine`_(一个文档映射器库)将 Flask 与 MongoDB 集成。

你需要一个正在运行的 MongoDB 服务器以及 Flask-MongoEngine 包。

pip install flask-mongoengine

配置

基础配置可以通过在 app.config 中定义 MONGODB_SETTINGS, 然后创建一个 MongoEngine 实例来完成。

from flask import Flask
from flask_mongoengine import MongoEngine

app = Flask(__name__)
app.config['MONGODB_SETTINGS'] = {
    "db": "myapp",
}
db = MongoEngine(app)

文档映射

要声明一个代表 Mongo 文档的模型,可以创建一个继承自 Document 的类, 并在其中声明每个字段。

import mongoengine as me

class Movie(me.Document):
    title = me.StringField(required=True)
    year = me.IntField()
    rated = me.StringField()
    director = me.StringField()
    actors = me.ListField()

如果文档中包含嵌套字段,可以使用 EmbeddedDocument 来定义嵌套文档的字段, 并使用 EmbeddedDocumentField 在父文档中声明该嵌套文档。

class Imdb(me.EmbeddedDocument):
    imdb_id = me.StringField()
    rating = me.DecimalField()
    votes = me.IntField()

class Movie(me.Document):
    ...
    imdb = me.EmbeddedDocumentField(Imdb)

创建数据

使用字段作为关键字参数实例化你的文档类。 也可以在实例化之后为字段属性赋值,然后调用 doc.save()

bttf = Movie(title="Back To The Future", year=1985)
bttf.actors = [
    "Michael J. Fox",
    "Christopher Lloyd"
]
bttf.imdb = Imdb(imdb_id="tt0088763", rating=8.5)
bttf.save()

查询

使用类的 objects 属性进行查询。关键字参数会匹配字段的等值。

bttf = Movies.objects(title="Back To The Future").get_or_404()

可以通过使用双下划线将查询操作符连接到字段名称来使用查询运算符。 objects 及其返回的查询结果是可迭代的。

some_theron_movie = Movie.objects(actors__in=["Charlize Theron"]).first()

for recents in Movie.objects(year__gte=2017):
    print(recents.title)

文档

MongoEngine 支持更多定义和查询文档的方式。 详细信息请参阅其 官方文档

Flask-MongoEngine 在 MongoEngine 的基础上增加了实用功能, 具体可以参考它们的 文档