在Python中使用mongoengine操作MongoDB教程
最近重新拾起Django,但是Django并不支持mongodb,但是有一個模塊mongoengine可以實現(xiàn)Django Model類似的封裝.但是mongoengine的中文文檔幾乎沒有,有的也是簡短的幾句介紹和使用.下面我就分享一下我在使用過程中所記錄下的一些筆記,可能有點亂.大家可以參考一下.
安裝mongoengine
easy_install pymongo # 依賴庫 easy_install mongoengine
基本使用
from mongoengine import * from datetime import datetime # 連接數(shù)據(jù)庫 connect('blog') # 連接本地blog數(shù)據(jù)庫 # 如需驗證和指定主機(jī)名 # connect('blog', host='192.168.3.1', username='root', password='1234') # 定義分類文檔 class Categories(Document): ' 繼承Document類,為普通文檔 ' name = StringField(max_length=30, required=True) artnum = IntField(default=0, required=True) date = DateTimeField(default=datetime.now(), required=True)
和Django的model使用很類似,所以也不解釋什么.
插入
cate = Categories(name="Linux") # 如果required為True則必須賦予初始值,如果有default,賦予初始值則使用默認(rèn)值 cate.save() # 保存到數(shù)據(jù)庫
查詢和更新
文檔類有一個 objects 屬性.我們使用它來查詢數(shù)據(jù)庫.
# 返回集合里的所有文檔對象的列表 cate = Categories.objects.all() # 返回所有符合查詢條件的結(jié)果的文檔對象列表 cate = Categories.objects(name="Python") # 更新查詢到的文檔: cate.name = "LinuxZen" cate.update()查詢數(shù)組 默認(rèn)查詢數(shù)組"="代表的意思是in:
class Posts(Document): artid = IntField(required=True) title = StringField(max_length=100, required=True) content = StringField(required=True) author = ReferenceField(User) tags = ListField(StringField(max_length=20, required=True), required=True) categories = ReferenceField(Categories), required=True) comments = IntField(default=0, required=True) # 將會返回所有tags包含coding的文檔 Posts.objects(tags='coding')
ReferenceField 引用字段:
通過引用字段可以通過文檔直接獲取引用字段引用的那個文檔:
class Categories(Document): name = StringField(max_length=30, required=True) artnum = IntField(default=0, required=True) date = DateTimeField(default=datetime.now(), required=True) class Posts(Document): title = StringField(max_length=100, required=True) content = StringField(required=True) tags = ListField(StringField(max_length=20, required=True), required=True) categories = ReferenceField(Categories)
插入引用字段
cate =Categories(name="Linux") cate.save() post = Posts(title="Linuxzen.com", content="Linuxzen.com",tags=["Linux","web"], categories=cate) post.save()
通過引用字段直接獲取引用文檔對象
一般文檔查詢會返回一個列表(盡管只有一個結(jié)果),我們想要獲得一個文檔對象可以使用索引獲取第一個文檔對象,但是mongoengine建議使用first()來獲取第一個:
>>> cate = Posts.objects.all().first().categories >>> cate >>> cate.name
u'Linux'
查詢包含Linux分類的文章
>>> cate = Categories.objects(name="Linux").first() >>> Posts.objects(categories=cate)
EmbeddedDocument 嵌入文檔
繼承EmbeddedDocument的文檔類就是嵌入文檔,嵌入文檔用于嵌入其他文檔的EmbeddedDocumentField 字段,比如上面例子的tags字段如果改成嵌入文檔的話可以將Posts文檔類改成如下方式:
class Posts(Document): title = StringField(max_length=100, required=True) content = StringField(required=True) tags = ListField(EmbeddedDocumentField('Tags')required=True) categories = ReferenceField(Categories)
還需要添加一個Tags嵌入文檔類:
class Tags(EmbeddedDocument): name = StringField() date = DateTimeField(default=datetime.now())
我們像如下方式插入Posts文檔中的Tags
>>> tag = Tags(name="Linuxzen") >>> post = Posts(title="Linuxzen.com", content="Linuxzen.com", tags=[tag], categories=cate) >>> tag = Tags(name="mysite") >>> post.tags.append(tag) >>> post.save() >>> tags = post.tags >>> for tag in tags: print tag.name Linuxzen mysite
時間段查詢
start = datetime(int(year), int(month), 1) if int(month) + 1 > 12: emonth = 1 eyear = int(year) + 1 else: emonth = int(month) + 1 eyear = int(year) end = datetime(eyear, emonth, 1) articles = Posts.objects(date__gte=start, date__lt=end).order_by('-date')
分片
slice用于分片
# comments - skip 5, limit 10 Page.objects.fields(slice__comments=[5, 10]) # 也可以使用索引值分片 # limit 5 users = User.objects[:5] # skip 5 users = User.objects[5:] # skip 10, limit 15 users = User.objects[10:15]
使用原始語句查詢
如果想使用原始的pymongo查詢方式可以使用__raw__操作符 Page.objects(raw={'tags':'coding'}) 使用$inc和$set操作符
# 更新嵌入文檔comments字段by的值為joe的文檔字段votes增加1 Page.objects(comments_by="joe").update(inc__votes=1) # 更新嵌入文檔comments字段by的值為joe的文檔字段votes設(shè)置為1 Page.objects(comments_by="joe").update(set__votes=1) 其他技巧 #查詢結(jié)果轉(zhuǎn)換成字典 users_dict = User.objects().to_mongo() # 排序,按日期排列 user = User.objects.order_by("date") # 按日期倒序 user = User.objects.order_by("-date")
- python連接mongodb操作數(shù)據(jù)示例(mongodb數(shù)據(jù)庫配置類)
- Python的MongoDB模塊PyMongo操作方法集錦
- Python中的MongoDB基本操作:連接、查詢實例
- 使用Python腳本操作MongoDB的教程
- python操作MongoDB基礎(chǔ)知識
- Python常見MongoDB數(shù)據(jù)庫操作實例總結(jié)
- 詳解Python3操作Mongodb簡明易懂教程
- Python操作mongodb數(shù)據(jù)庫進(jìn)行模糊查詢操作示例
- Python 操作 MongoDB 講解詳細(xì)
- Python操作MongoDB的實現(xiàn)示例
相關(guān)文章
Python利用smtplib實現(xiàn)郵件發(fā)送
在當(dāng)今數(shù)字時代,電子郵件已成為我們生活和工作中不可或缺的一部分,本篇文章將為你講解如何在Python發(fā)送郵件,并為你提供實現(xiàn)的多種方式,希望對大家有所幫助2023-06-06Python基于TensorFlow接口實現(xiàn)深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)回歸
這篇文章主要為大家詳細(xì)介紹了如何基于Python語言中TensorFlow的tf.estimator接口,實現(xiàn)深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)回歸的具體方法,感興趣的可以了解一下2023-02-02Python?nonlocal關(guān)鍵字?與?global?關(guān)鍵字解析
這篇文章主要介紹了Python?nonlocal關(guān)鍵字?與?global?關(guān)鍵字解析,nonlocal關(guān)鍵字用來在函數(shù)或其他作用域中使用外層變量,global關(guān)鍵字用來在函數(shù)或其他局部作用域中使用全局變量,更多香瓜內(nèi)容需要的小伙伴可以參考一下2022-03-03