国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

在Python中使用mongoengine操作MongoDB教程

2019-11-25 17:39:42
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

最近重新拾起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為T(mén)rue則必須賦予初始值,如果有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.nameLinuxzenmysite

時(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 10Page.objects.fields(slice__comments=[5, 10])# 也可以使用索引值分片# limit 5users = User.objects[:5]# skip 5users = User.objects[5:]# skip 10, limit 15users = User.objects[10:15]

使用原始語(yǔ)句查詢

如果想使用原始的pymongo查詢方式可以使用__raw__操作符 Page.objects(raw={'tags':'coding'}) 使用$inc和$set操作符

# 更新嵌入文檔comments字段by的值為joe的文檔字段votes增加1Page.objects(comments_by="joe").update(inc__votes=1)# 更新嵌入文檔comments字段by的值為joe的文檔字段votes設(shè)置為1Page.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")

 

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 武隆县| 石屏县| 泰兴市| 沙湾县| 修水县| 中西区| 砚山县| 东丽区| 辽中县| 南皮县| 新郑市| 临海市| 舞阳县| 汶川县| 遂溪县| 砚山县| 南昌市| 仙桃市| 鹿邑县| 莲花县| 柞水县| 长宁县| 肥西县| 盈江县| 定远县| 周口市| 安吉县| 钟祥市| 贺兰县| 广饶县| 丹巴县| 临湘市| 寿光市| 丹江口市| 石嘴山市| 隆德县| 仙游县| 陇西县| 连州市| 昌吉市| 双柏县|