flask_mongoengine的使用


基本使用

from mongoengine import *
from datetime import datetime
# 連接數據庫
connect('blog')   # 連接本地blog數據庫
# 如需驗證和指定主機名
# 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使用很類似,所以也不解釋什么.

 

查詢和更新

文檔類有一個 objects 屬性.我們使用它來查詢數據庫.

# 返回集合里的所有文檔對象的列表
cate = Categories.objects.all()

# 返回所有符合查詢條件的結果的文檔對象列表
cate = Categories.objects(name="Python")
# 更新查詢到的文檔:
cate.name = "LinuxZen"
cate.update()
查詢數組 默認查詢數組"="代表的意思是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()

通過引用字段直接獲取引用文檔對象

一般文檔查詢會返回一個列表(盡管只有一個結果),我們想要獲得一個文檔對象可以使用索引獲取第一個文檔對象,但是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設置為1
Page.objects(comments_by="joe").update(set__votes=1)

其他技巧

#查詢結果轉換成字典
users_dict = User.objects().to_mongo()

# 排序,按日期排列
user = User.objects.order_by("date")

# 按日期倒序

user = User.objects.order_by("-date")

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM