Python利用ORM控制MongoDB(MongoEngine)的步驟全紀(jì)錄
簡(jiǎn)介:
MongoEngine 是一個(gè)Document-Object Mapper (想一下ORM, 但它是針對(duì)文檔型數(shù)據(jù)庫(kù)),Python通過(guò)它與MongoDB交互。你可能會(huì)說(shuō)那PyMongo也是ORM啊,在Python中一切都是對(duì)象,但我們所說(shuō)的ORM中的Object在指Python中的自定義類,而不是內(nèi)置類型。MongoEngine或MongoKit將MongoDB的數(shù)據(jù)映射成自定義類實(shí)例,它們都是基于PyMongo的。
我們可以跟關(guān)系型數(shù)據(jù)庫(kù)的Python客戶端MySQLdb,以及ORM SQLAlchemy/Django ORM比較一下,PyMongo相當(dāng)于MySQLdb,MongoEngine相當(dāng)于SQLAlchemy,SQLAlchemy是基于MySQLdb之上的,MongoEngine是基于PyMongo的。
pymongo來(lái)操作MongoDB數(shù)據(jù)庫(kù),但是直接把對(duì)于數(shù)據(jù)庫(kù)的操作代碼都寫(xiě)在腳本中,這會(huì)讓?xiě)?yīng)用的代碼耦合性太強(qiáng),而且不利于代碼的優(yōu)化管理
一般應(yīng)用都是使用MVC框架來(lái)設(shè)計(jì)的,為了更好地維持MVC結(jié)構(gòu),需要把數(shù)據(jù)庫(kù)操作部分作為model抽離出來(lái),這就需要借助MongoEngine,MongoEngine提供的抽象是基于類的,創(chuàng)建的所有模型都是類
我們可以跟關(guān)系型數(shù)據(jù)庫(kù)的Python客戶端MySQLdb,以及ORM SQLAlchemy/Django ORM比較一下,PyMongo相當(dāng)于MySQLdb,MongoEngine相當(dāng)于SQLAlchemy,SQLAlchemy是基于MySQLdb之上的,MongoEngine是基于PyMongo的
安裝
pip install mongoengine
使用
1.使用時(shí)先聲明一個(gè)繼承自MongoEngine.Document的類
在類中聲明一些屬性,相當(dāng)于創(chuàng)建一個(gè)用來(lái)保存數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),即數(shù)據(jù)已類似數(shù)據(jù)結(jié)構(gòu)的形式存入數(shù)據(jù)庫(kù)中,通常把這樣的一些類都存放在一個(gè)腳本中,作為應(yīng)用的Model模塊
from mongoengine import *
connect('mydb', host='localhost', port=27017)
import datetime
class Users(Document):
name = StringField(required=True, max_length=200)
age = IntField(required=True)
users = Users.objects.all() #返回所有的文檔對(duì)象列表
for u in users:
print("name:",u.name,",age:",u.age)
2.保存文檔
required:設(shè)置必須;
default:如果沒(méi)有其他值給出使用指定的默認(rèn)值
unique:確保集合中沒(méi)有其他document有此字段的值相同
choices:確保該字段的值等于數(shù)組中的給定值之一
from mongoengine import *
connect('mydb', host='localhost', port=27017)
import datetime
class Users(Document):
name = StringField(required=True, max_length=200)
age = IntField(required=True)
user1 = Users(
name='jack',
age= 21
)
user1.save()
print(user1.name)
user1.name = 'jack2'
user1.save()
print(user1.name)
3.查詢10=<年齡<30的,按姓名排列
from mongoengine import *
connect('mydb', host='localhost', port=27017)
import datetime
class Users(Document):
name = StringField(required=True, max_length=200)
age = IntField(required=True)
user_search = Users.objects(age__gte=10, age__lt=33).order_by('name')
for u in user_search:
print("name:",u.name,",age:",u.age)
查詢10=<年齡<30的,按姓名倒序
from mongoengine import *
connect('mydb', host='localhost', port=27017)
import datetime
class Users(Document):
name = StringField(required=True, max_length=200)
age = IntField(required=True)
user_search = Users.objects(age__gte=10, age__lt=33).order_by('-name')
for u in user_search:
print("name:",u.name,",age:",u.age)
查詢name=jack2
from mongoengine import *
connect('mydb', host='localhost', port=27017)
import datetime
class Users(Document):
name = StringField(required=True, max_length=200)
age = IntField(required=True)
tmp = Users.objects(name="jack2")
for u in tmp:
print("name:",u.name,",age:",u.age)
4.修改name=jack2 的age加1
from mongoengine import *
connect('mydb', host='localhost', port=27017)
import datetime
class Users(Document):
name = StringField(required=True, max_length=200)
age = IntField(required=True)
tmp = Users.objects(name="jack3").update(inc__age=1)
tmp = Users.objects(name="jack3")
for u in tmp:
print("name:",u.name,",age:",u.age)
修改name=jack的age設(shè)為66
from mongoengine import *
connect('mydb', host='localhost', port=27017)
import datetime
class Users(Document):
name = StringField(required=True, max_length=200)
age = IntField(required=True)
tmp = Users.objects(name="jack").update(set__age=66)
tmp = Users.objects(name="jack")
for u in tmp:
print("name:",u.name,",age:",u.age)
高級(jí)查詢
例如有時(shí)候你需要將約束條件進(jìn)行與,或的操作。你可以使用mongoengine提供的 Q 類來(lái)實(shí)現(xiàn),一個(gè) Q 類代表了一個(gè)查詢的一部分,里面的參數(shù)設(shè)置與你查詢document的時(shí)候相同。建立一個(gè)復(fù)雜查詢的時(shí)候,你需要用 & 或 | 操作符將 Q 對(duì)象連結(jié)起來(lái),例子如下:
Post.objects(Q(name="jack") | Q(age=66))
查詢相關(guān)操作符
ne – 不等于
lt – 小于
lte – 小于等于
gt – 大于
gte – 大于等于
not – 使其檢查的反面,需要使用在其他操作符之前(e.g. Q(age__not__mod=5))
in – 值在list里面
nin – 值不在list里面
mod – value % x == y
all – list里面所有的值
size – 這個(gè)array的大小
exists – 存在這個(gè)值
#一下操作符在需要進(jìn)行正則檢查的時(shí)候是比較快捷的方法:
exact – 字符串型字段完全匹配這個(gè)值
iexact – 字符串型字段完全匹配這個(gè)值(大小寫(xiě)敏感)
contains – 字符串字段包含這個(gè)值
icontains –字符串字段包含這個(gè)值(大小寫(xiě)敏感)
startswith – 字符串字段由這個(gè)值開(kāi)頭
istartswith –字符串字段由這個(gè)值開(kāi)頭(大小寫(xiě)敏感)
endswith – 字符串字段由這個(gè)值結(jié)尾
iendswith –字符串字段由這個(gè)值結(jié)尾(大小寫(xiě)敏感)
match – 使你可以使用一整個(gè)document與數(shù)組進(jìn)行匹配查詢list
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Python基于Socket實(shí)現(xiàn)簡(jiǎn)單聊天室
這篇文章主要為大家詳細(xì)介紹了Python基于Socket實(shí)現(xiàn)簡(jiǎn)單聊天室,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02
詳解從Django Rest Framework響應(yīng)中刪除空字段
這篇文章主要介紹了詳解從Django Rest Framework響應(yīng)中刪除空字段,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
簡(jiǎn)單介紹Python的輕便web框架Bottle
這篇文章主要介紹了Python的輕便web框架Bottle,因其注重輕便的設(shè)計(jì),與Flask一樣,Bottle框架的人氣同樣也非常高,需要的朋友可以參考下2015-04-04
python開(kāi)發(fā)一個(gè)解析protobuf文件的簡(jiǎn)單編譯器
這篇文章主要介紹了python如何開(kāi)發(fā)一個(gè)解析protobuf文件的簡(jiǎn)單編譯器,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下2020-11-11
python 實(shí)現(xiàn)多線程下載視頻的代碼
這篇文章主要介紹了python 實(shí)現(xiàn)多線程下載視頻的代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11
詳解Python如何實(shí)現(xiàn)Excel數(shù)據(jù)讀取和寫(xiě)入
這篇文章主要為大家詳細(xì)介紹了python如何實(shí)現(xiàn)對(duì)EXCEL數(shù)據(jù)進(jìn)行讀取和寫(xiě)入,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04

