- MongoEngine 教程
- MongoEngine - 首頁
- MongoEngine - MongoDB
- MongoEngine - MongoDB Compass
- MongoEngine - 物件文件對映器 (Object Document Mapper)
- MongoEngine - 安裝
- MongoEngine - 連線到 MongoDB 資料庫
- MongoEngine - 文件類
- MongoEngine - 動態模式
- MongoEngine - 欄位
- MongoEngine - 新增/刪除文件
- MongoEngine - 資料庫查詢
- MongoEngine - 過濾器
- MongoEngine - 查詢運算子
- MongoEngine - QuerySet 方法
- MongoEngine - 排序
- MongoEngine - 自定義 QuerySet
- MongoEngine - 索引
- MongoEngine - 聚合
- MongoEngine - 高階查詢
- MongoEngine - 文件繼承
- MongoEngine - 原子更新
- MongoEngine - Javascript
- MongoEngine - GridFS
- MongoEngine - 訊號
- MongoEngine - 文字搜尋
- MongoEngine - 擴充套件
- MongoEngine 有用資源
- MongoEngine - 快速指南
- MongoEngine - 有用資源
- MongoEngine - 討論
MongoEngine - 欄位
一個 MongoEngine 文件類包含一個或多個屬性。每個屬性都是 Field 類的物件。BaseField 是所有欄位型別的基類。BaseField 類的建構函式具有以下引數:
BaseField(db_field, required, default, unique, primary_key)
db_field 表示資料庫欄位的名稱。
required 引數決定此欄位的值是否必填,預設為 false。
default 引數包含此欄位的預設值。
unique 引數預設為 false。如果希望每個文件的此欄位具有唯一值,則將其設定為 true。
primary_key 引數預設為 false。設定為 true 將使此欄位成為主鍵。
有許多從 BaseField 派生的 Field 類。
數值欄位
IntField(32 位整數)、LongField(64 位整數)、FloatField(浮點數)欄位建構函式具有 min_value 和 max_value 引數。
還有一個 DecimalField 類。此欄位物件的 value 是一個浮點數,可以指定其精度。DecimalField 類定義了以下引數:
DecimalField(min_value, max_value, force_string, precision, rounding)
| min_value | 指定最小可接受值 |
| max_value | 指定欄位的最大值 |
| force_string | 如果為 True,則此欄位的值將儲存為字串 |
| precision | 將浮點表示限制為指定位數 |
| rounding | 根據以下預定義常量對數字進行舍入:decimal.ROUND_CEILING(朝正無窮大方向舍入)、decimal.ROUND_DOWN(朝零方向舍入)、decimal.ROUND_FLOOR(朝負無窮大方向舍入)、decimal.ROUND_HALF_DOWN(四捨五入,當出現 .5 時,朝零方向舍入)、decimal.ROUND_HALF_EVEN(四捨五入,當出現 .5 時,朝最近的偶數舍入)、decimal.ROUND_HALF_UP(四捨五入,當出現 .5 時,遠離零方向舍入)、decimal.ROUND_UP(遠離零方向舍入)、decimal.ROUND_05UP(如果舍入到零方向後的最後一位數字為 0 或 5,則遠離零方向舍入;否則朝零方向舍入) |
文字欄位
StringField 物件可以儲存任何 Unicode 值。您可以在建構函式中指定字串的 min_length 和 max_length。URLField 物件是一個 StringField,具有將輸入驗證為 URL 的功能。EmailField 將字串驗證為有效的電子郵件表示形式。
StringField(max-length, min_length) URLField(url_regex) EmailField(domain_whiltelist, allow_utf8_user, allow_ip_domain)
domain_whitelist 引數包含您不支援的無效域名列表。如果設定為 True,則 allow_utf8_user 引數允許字串包含 UTF8 字元作為電子郵件的一部分。allow_ip_domain 引數預設為 false,但如果為 true,則可以是有效的 IPV4 或 IPV6 地址。
以下示例使用數值和字串欄位:
from mongoengine import *
connect('studentDB')
class Student(Document):
studentid = StringField(required=True)
name = StringField()
age=IntField(min_value=6, max-value=20)
percent=DecimalField(precision=2)
email=EmailField()
s1=Student()
s1.studentid='001'
s1.name='Mohan Lal'
s1.age=20
s1.percent=75
s1.email='mohanlal@gmail.com'
s1.save()
執行上述程式碼後,student 集合將顯示如下文件:
ListField
這種型別的欄位包裝任何標準欄位,從而允許將多個物件用作資料庫中的列表物件。此欄位可以與 ReferenceField 一起使用以實現一對多關係。
上面示例中的 student 文件類修改如下:
from mongoengine import *
connect('studentDB')
class Student(Document):
studentid = StringField(required=True)
name = StringField(max_length=50)
subjects = ListField(StringField())
s1=Student()
s1.studentid='A001'
s1.name='Mohan Lal'
s1.subjects=['phy', 'che', 'maths']
s1.save()
新增的文件以 JSON 格式顯示如下:
{
"_id":{"$oid":"5ea6a1f4d8d48409f9640319"},
"studentid":"A001",
"name":"Mohan Lal",
"subjects":["phy","che","maths"]
}
DictField
DictField 類的物件儲存 Python 字典物件。在相應的資料庫欄位中,這也將被儲存。
在上面示例中,我們將 ListField 的型別更改為 DictField。
from mongoengine import *
connect('studentDB')
class Student(Document):
studentid = StringField(required=True)
name = StringField(max_length=50)
subjects = DictField()
s1=Student()
s1.studentid='A001'
s1.name='Mohan Lal'
s1.subjects['phy']=60
s1.subjects['che']=70
s1.subjects['maths']=80
s1.save()
資料庫中的文件顯示如下:
{
"_id":{"$oid":"5ea6cfbe1788374c81ccaacb"},
"studentid":"A001",
"name":"Mohan Lal",
"subjects":{"phy":{"$numberInt":"60"},
"che":{"$numberInt":"70"},
"maths":{"$numberInt":"80"}
}
}
ReferenceField
MongoDB 文件可以使用這種型別的欄位儲存對另一個文件的引用。這樣,我們就可以像在 RDBMS 中一樣實現連線。ReferenceField 建構函式使用其他文件類的名稱作為引數。
class doc1(Document): field1=StringField() class doc2(Document): field1=StringField() field2=ReferenceField(doc1)
在下面的示例中,StudentDB 資料庫包含兩個文件類:student 和 teacher。Student 類的文件包含對 teacher 類物件的引用。
from mongoengine import *
connect('studentDB')
class Teacher (Document):
tid=StringField(required=True)
name=StringField()
class Student(Document):
sid = StringField(required=True)
name = StringField()
tid=ReferenceField(Teacher)
t1=Teacher()
t1.tid='T1'
t1.name='Murthy'
t1.save()
s1=Student()
s1.sid='S1'
s1.name='Mohan'
s1.tid=t1
s1.save()
執行上述程式碼並在 Compass GUI 中驗證結果。StudentDB 資料庫中將建立與兩個文件類對應的兩個集合。
新增的 teacher 文件如下:
{
"_id":{"$oid":"5ead627463976ea5159f3081"},
"tid":"T1",
"name":"Murthy"
}
student 文件的內容如下:
{
"_id":{"$oid":"5ead627463976ea5159f3082"},
"sid":"S1",
"name":"Mohan",
"tid":{"$oid":"5ead627463976ea5159f3081"}
}
請注意,Student 文件中的 ReferenceField 儲存相應 Teacher 文件的 _id。訪問時,Student 物件會自動轉換為引用,並在訪問相應的 Teacher 物件時取消引用。
要新增對正在定義的文件的引用,請使用“self”代替其他文件類作為 ReferenceField 的引數。需要注意的是,使用 ReferenceField 可能會導致文件檢索方面的效能下降。
ReferenceField 建構函式還有一個可選引數 reverse_delete_rule。其值決定了如果引用的文件被刪除該怎麼辦。
可能的值如下:
DO_NOTHING (0) - 什麼也不做(預設)。
NULLIFY (1) - 將引用更新為 null。
CASCADE (2) - 刪除與引用關聯的文件。
DENY (3) - 防止刪除引用物件。
PULL (4) - 從引用的 ListField 中刪除引用
您可以使用引用列表來實現一對多關係。假設一個 student 文件必須與一個或多個 teacher 文件相關聯,則 Student 類必須具有 ReferenceField 例項的 ListField。
from mongoengine import *
connect('studentDB')
class Teacher (Document):
tid=StringField(required=True)
name=StringField()
class Student(Document):
sid = StringField(required=True)
name = StringField()
tid=ListField(ReferenceField(Teacher))
t1=Teacher()
t1.tid='T1'
t1.name='Murthy'
t1.save()
t2=Teacher()
t2.tid='T2'
t2.name='Saxena'
t2.save()
s1=Student()
s1.sid='S1'
s1.name='Mohan'
s1.tid=[t1,t2]
s1.save()
在 Compass 中驗證上述程式碼的結果後,您將發現 student 文件具有兩個 teacher 文件的引用:
Teacher Collection
{
"_id":{"$oid":"5eaebcb61ae527e0db6d15e4"},
"tid":"T1","name":"Murthy"
}
{
"_id":{"$oid":"5eaebcb61ae527e0db6d15e5"},
"tid":"T2","name":"Saxena"
}
Student collection
{
"_id":{"$oid":"5eaebcb61ae527e0db6d15e6"},
"sid":"S1","name":"Mohan",
"tid":[{"$oid":"5eaebcb61ae527e0db6d15e4"},{"$oid":"5eaebcb61ae527e0db6d15e5"}]
}
DateTimeField
DateTimeField 類的例項允許在 MongoDB 資料庫中使用日期格式的資料。MongoEngine 查詢 Python-DateUtil 庫來解析適當日期格式的資料。如果它在當前安裝中不可用,則日期將使用內建 time 模組的 time.strptime() 函式表示。此型別欄位的預設值為當前 datetime 例項。
DynamicField
此欄位可以處理不同型別的變化資料。此型別的欄位在內部由 DynamicDocument 類使用。
ImageField
此型別的欄位對應於文件中可以儲存影像檔案的欄位。此類的建構函式可以接受 size 和 thumbnail_size 引數(均以畫素大小表示)。