Mongoengine是Python上的一個MongoDB對象文檔映射庫。它允許在Python中使用文檔模型來設計MongoDB數據庫。它基於PyMongo和其它庫來實現MongoDB原生API的所有功能,並且提供了額外的方便的功能。
一、快速入門
為了開始使用Mongoengine,我們需要安裝PyMongo和mongoengine:
pip install pymongo
pip install mongoengine
下面是連接數據庫和定義模型的簡單示例:
from mongoengine import connect, Document, StringField
connect('testdb', host='localhost', port=27017)
class User(Document):
name = StringField(required=True)
email = StringField(required=True)
password = StringField(required=True)
user = User(name='John', email='john@example.com', password='password')
user.save()
這段代碼連接到本地MongoDB服務器上,並定義了一個名為User的文檔模型。該模型包括三個字段: name,email和password。我們創建一個User文檔實例並將其保存到數據庫中。
二、文檔模型
在Mongoengine中,文檔模型是Python類的實例,其映射到MongoDB數據庫中的文檔。每個文檔都具有一個唯一的ID索引,這一點類似於SQL數據模型中的主鍵。
我們可以為模型定義字段,也稱為屬性,來表示文檔的屬性。模型在創建時需要指定文檔名稱,並可能指定其父類。
下面是一個示例:
class Animal(Document):
name = StringField(required=True)
weight = FloatField(required=True)
meta = {
'collection': 'animals'
}
class Dog(Animal):
breed = StringField(required=True)
class Cat(Animal):
color = StringField(required=True)
在上面的示例中,我們定義了一個Animal基類,並繼承自它的兩個子類:Dog和Cat。 Animal包含兩個字段,name和weight,分別表示動物的名稱和體重。通常, meta屬性用於指定文檔名稱。然而,如果你需要指定特定的集合名稱,就可以使用Collection。
三、查詢
mongoengine的查詢API是非常強大的。它提供了一組強大的方法來處理幾乎所有的查詢需求。
下面是一些示例:
# 獲取所有用戶
users = User.objects
# 獲取第一個用戶
user = User.objects.first()
# 獲取名為John的用戶
user = User.objects(name='John').first()
# 獲取名為John或者Alice的所有用戶
users = User.objects(name__in=['John', 'Alice'])
# 獲取名字以J開頭的所有用戶
users = User.objects(name__startswith='J')
# 獲取名為John並且電子郵件地址為john@example.com的用戶
user = User.objects(name='John', email='john@example.com').first()
可以看出,我們可以使用objects屬性輕鬆的進行不同類型的查詢。其中,__in運算符可用於匹配包含於指定列表或元組中任意值的字段。
四、更新和刪除
修改文檔的最簡單方法是直接對其屬性進行賦值,就像操作Python對象一樣。然後,可以調用save()方法來更新文檔。
user = User.objects(name='John').first()
user.email = 'new_email@example.com'
user.save()
要從集合中刪除文檔,可以調用delete()方法:
user = User.objects(name='John').first()
user.delete()
五、引用和嵌套
在Mongoengine中,可以使用ReferenceField來引用另一個文檔,使用EmbeddedDocumentField來嵌套一些簡單的數據。這些引用和嵌套的方法讓我們的數據建模更加靈活。
下面是一個樣例模型:
class Post(Document):
title = StringField(required=True)
content = StringField()
author = ReferenceField(User, required=True)
class Comment(EmbeddedDocument):
content = StringField(required=True)
author = ReferenceField(User, required=True)
class Blog(Document):
posts = ListField(ReferenceField(Post))
comments = ListField(EmbeddedDocumentField(Comment))
在這個模型中,Post類引用一個User文檔,表示評論的作者。此外,它還包括一個嵌套的Comment文檔列表。Blog類包含一個列表指向Post文檔,也有一個嵌套的Comment文檔列表。
六、總結
本文介紹了Mongoengine的一些主要特性,包括定義文檔模型、查詢、更新和刪除、引用和嵌套等。Mongoengine是一個非常強大和靈活的MongoDB ORM庫,支持Python 2和3。如果你正在尋找一種面向文檔的數據建模方式,Mongoengine可能是一個不錯的選擇。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/236958.html
微信掃一掃
支付寶掃一掃