MongoDB 與 MongoEngine

使用如 MongoDB 的文件資料庫是關聯式 SQL 資料庫常見的替代方案。此模式展示如何使用文件映射器函式庫 MongoEngine 與 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 之上添加了有用的工具。也請查看他們的文件