在Python中使用mongoengine操作MongoDB教程
這篇文章主要介紹了在Python中使用mongoengine操作MongoDB教程,包括在Django下的一些使用技巧,需要的朋友可以參考下
最近重新拾起Django,但是Django并不支持mongodb,但是有一個(gè)模塊mongoengine可以實(shí)現(xiàn)Django Model類似的封裝.但是mongoengine的中文文檔幾乎沒(méi)有,有的也是簡(jiǎn)短的幾句介紹和使用.下面我就分享一下我在使用過(guò)程中所記錄下的一些筆記,可能有點(diǎn)亂.大家可以參考一下.
安裝mongoengine
easy_install pymongo # 依賴庫(kù)
easy_install mongoengine
基本使用
from mongoengine import *
from datetime import datetime
# 連接數(shù)據(jù)庫(kù)
connect('blog') # 連接本地blog數(shù)據(jù)庫(kù)
# 如需驗(yàn)證和指定主機(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ù)庫(kù)
查詢和更新
文檔類有一個(gè) objects 屬性.我們使用它來(lái)查詢數(shù)據(jù)庫(kù).
# 返回集合里的所有文檔對(duì)象的列表
cate = Categories.objects.all()
# 返回所有符合查詢條件的結(jié)果的文檔對(duì)象列表
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)
# 將會(huì)返回所有tags包含coding的文檔
Posts.objects(tags='coding')
ReferenceField 引用字段:
通過(guò)引用字段可以通過(guò)文檔直接獲取引用字段引用的那個(gè)文檔:
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()
通過(guò)引用字段直接獲取引用文檔對(duì)象
一般文檔查詢會(huì)返回一個(gè)列表(盡管只有一個(gè)結(jié)果),我們想要獲得一個(gè)文檔對(duì)象可以使用索引獲取第一個(gè)文檔對(duì)象,但是mongoengine建議使用first()來(lái)獲取第一個(gè):
>>> 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)
還需要添加一個(gè)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
時(shí)間段查詢
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]
使用原始語(yǔ)句查詢
如果想使用原始的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")
更多信息請(qǐng)查看IT技術(shù)專欄