MongoDB 是最受歡迎的 NoSQL 資料庫之一,但直接使用原始的 PyMongo 可能會顯得冗長且容易出錯。您會花太多時間撰寫用於文件驗證、欄位型別檢查和關係管理的樣板程式碼。MongoEngine 解決了這個問題,它為 MongoDB 帶來了類似 Django 的宣告式抽象層,在超過十年的 Python 開發中經受了時間的考驗。
MongoEngine 是一個 Python 物件文件對映器(ODM),為與 MongoDB 互動提供了高階的宣告式 API。它將文件定義為帶有型別欄位的 Python 類別,支援驗證、關係、索引,並透過富有表達力的 QuerySet API 進行查詢。位於 github.com/MongoEngine/mongoengine 的專案自 2010 年以來一直處於活躍開發中,並持續在 MongoDB 4.4 到 8.0 版本之間保持維護。
該函式庫專為那些既想要 MongoDB 文件模型的靈活性,又想要型別化 Python 物件的安全性和生產效率的開發者而設計。如果您使用過 Django 的 ORM,那麼 MongoEngine 的模式會讓您立刻感到熟悉——這正是設計的初衷。
什麼是 MongoEngine?
MongoEngine 是一個 Python ODM,將 MongoDB 文件對映到 Python 物件。它提供欄位驗證、查詢建構、引用處理和模式強制執行,同時在需要時保留 MongoDB 的模式彈性。文件以類別形式宣告式定義,查詢返回的是型別化的 Python 物件,而非原始字典。
from mongoengine import Document, StringField, IntField, ListField
class User(Document):
name = StringField(required=True, max_length=50)
email = StringField(required=True, unique=True)
age = IntField(min_value=0)
tags = ListField(StringField())
# 使用方式
user = User(name="Alice", email="alice@example.com", age=30, tags=["python", "mongodb"])
user.save()
MongoEngine 有哪些依賴?
MongoEngine 的依賴腳印非常輕量。
| 依賴 | 用途 | 版本要求 |
|---|---|---|
| PyMongo | 核心 MongoDB 驅動程式 | 3.4+ |
| MongoDB 伺服器 | 資料庫後端 | 4.4 至 8.0 |
| gridfs(選用) | 支援大型檔案的 GridFS | 隨 PyMongo 提供 |
| blinker(選用) | 支援前/後儲存鉤子的訊號機制 | 1.1+ |
不需要 ORM 風格的神奇函式庫或 C 擴充。MongoEngine 是在 PyMongo 之上的純 Python 實作。
MongoEngine 支援哪些 MongoDB 版本?
MongoEngine 的相容性矩陣涵蓋 MongoDB 4.4 到最新的 8.0 版本。
| MongoDB 版本 | MongoEngine 相容性 | 主要特性 |
|---|---|---|
| 4.4 | 完整支援 | 穩定的生產使用 |
| 5.0 | 完整支援 | 時間序列集合 |
| 6.0 | 完整支援 | 變更串流、聚合改進 |
| 7.0 | 完整支援 | 可查詢加密、新的聚合階段 |
| 8.0 | 完整支援 | 最新的效能改進 |
該專案在所有支援的版本上維持 CI 測試,以確保與每個 MongoDB 發佈版本的相容性。
MongoEngine 模型在實務中長什麼樣子?
MongoEngine 的宣告式 API 讓文件建模變得直觀。以下是一個包含關係的更複雜範例:
from mongoengine import *
class Post(Document):
title = StringField(required=True)
content = StringField()
published_date = DateTimeField()
author = ReferenceField('User')
tags = ListField(StringField())
meta = {'indexes': ['title', 'published_date']}
class Comment(Document):
post = ReferenceField(Post, reverse_delete_rule=CASCADE)
author = StringField()
text = StringField()
created_date = DateTimeField(default=datetime.now)
查詢使用流暢的 QuerySet API,可以乾淨地鏈接:
posts = Post.objects(author=user, published_date__gte=some_date)
comments = Comment.objects(post=post).order_by('-created_date')
MongoEngine 可以與 Flask 一起使用嗎?
可以。Flask-MongoEngine 將 MongoEngine 包裝在 Flask 應用程式中,提供了設定模式和整合的工作階段處理。
from flask import Flask
from flask_mongoengine import MongoEngine
app = Flask(__name__)
app.config['MONGODB_SETTINGS'] = {
'host': 'mongodb://localhost:27017/mydatabase'
}
db = MongoEngine(app)
設定完成後,您的 MongoEngine Document 類別可以在 Flask 的應用程式上下文中運作,包括請求範圍的連線和範本全域變數。
常見問題
什麼是 MongoEngine?
MongoEngine 是一個 Python 物件文件對映器(ODM),用於 MongoDB,將資料庫文件對映到型別化的 Python 物件。它提供類似 Django ORM 的宣告式 API,包含欄位驗證、查詢建構和關係管理。
MongoEngine 有哪些依賴?
MongoEngine 唯一的硬依賴是 PyMongo 3.4+。選用依賴包括用於訊號支援的 blinker 和用於大型檔案儲存的 gridfs。
MongoEngine 支援哪些 MongoDB 版本?
完整支援 MongoDB 4.4、5.0、6.0、7.0 和 8.0。CI 測試涵蓋所有這些版本,以確保持續的相容性。
MongoEngine 模型長什麼樣子?
MongoEngine 模型是一個繼承自 Document 的 Python 類別,帶有型別化的欄位定義(StringField、IntField、DateTimeField、ReferenceField 等)。查詢使用類似 Django 的過濾語法,搭配流暢的 QuerySet API。
MongoEngine 是否與 Flask 相容?
是的。Flask-MongoEngine 提供無縫整合,在 Flask 的應用程式上下文中處理設定和連線生命週期。
延伸閱讀
classDiagram
class Document {
+save()
+delete()
+update()
}
class User {
+StringField name
+StringField email
+IntField age
+ListField tags
}
class Post {
+StringField title
+StringField content
+DateTimeField published_date
+ReferenceField author
+ListField tags
}
class Comment {
+ReferenceField post
+StringField author
+StringField text
+DateTimeField created_date
}
Document <|-- User
Document <|-- Post
Document <|-- Comment
Post --> User : author
Comment --> Post : postflowchart LR
A[Python 程式碼] --> B[MongoEngine ODM]
B --> C[驗證層]
C --> D[查詢建構器]
D --> E[PyMongo 驅動程式]
E --> F[MongoDB 伺服器]
F --> G[MongoDB 4.4]
F --> H[MongoDB 5.0]
F --> I[MongoDB 6.0]
F --> J[MongoDB 7.0]
F --> K[MongoDB 8.0]
無程式碼也能輕鬆打造專業LINE官方帳號!一鍵導入模板,讓AI助你行銷加分!