通过 MongoEngine 使用 MongoDB

使用一个 MongoDB 之类的文档型数据库来代替关系 SQL 数据是很常见的。本方案演示如何使用文档映射库 MongoEngine 来集成 MongoDB 。

先准备好一个运行中的 MongoDB 服务和 Flask-MongoEngine

  1. pip install flask-mongoengine

配置

基本的配置是在 app.config 中定义 MONGODB_SETTINGS 并创建一个MongoEngine 实例:

  1. from flask import Flask
  2. from flask_mongoengine import MongoEngine
  3. app = Flask(__name__)
  4. app.config['MONGODB_SETTINGS'] = {
  5. "db": "myapp",
  6. }
  7. db = MongoEngine(app)

映射文档

声明用于一个 Mongo 文档的模型的方法是创建一个 Document 的子类,然后声明每个字段:

  1. import mongoengine as me
  2. class Movie(me.Document):
  3. title = me.StringField(required=True)
  4. year = me.IntField()
  5. rated = me.StringField()
  6. director = me.StringField()
  7. actors = me.ListField()

如果文档包含嵌套的字段,那么使用 EmbeddedDocument 来定义嵌套的文档,并在父文档中使用 EmbeddedDocumentField 声明相应的字段:

  1. class Imdb(me.EmbeddedDocument):
  2. imdb_id = me.StringField()
  3. rating = me.DecimalField()
  4. votes = me.IntField()
  5. class Movie(me.Document):
  6. ...
  7. imdb = me.EmbeddedDocumentField(Imdb)

创建数据

使用字段的关键字参数实例化文档类。还可以在实例化后为字段属性指定值。然后调用 doc.save()

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

查询

使用类的 objects 属性来执行查询。关键字参数用于字段的等值查询:

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

字段名称后加双下划线可以连接查询操作符。objects 及其返回的查询是可迭代的:

  1. some_theron_movie = Movie.objects(actors__in=["Charlize Theron"]).first()
  2. for recents in Movie.objects(year__gte=2017):
  3. print(recents.title)

相关文档

有许多关于使用 MongoEngine 定义和查询文档数据的方法,更多信息请参阅其官方文档

Flask-MongoEngine 为 MongoEngine 添加了有用的工具,请参阅其文档说明