在Python中使用mongoengine操作MongoDB教程

來源:互聯網
上載者:User

在Python中使用mongoengine操作MongoDB教程

   在Python中使用mongoengine操作MongoDB教程

         這篇文章主要介紹了在Python中使用mongoengine操作MongoDB教程,包括在Django下的一些提示,需要的朋友可以參考下

  最近重新拾起Django,但是Django並不支援mongodb,但是有一個模組mongoengine可以實現Django Model類似的封裝.但是mongoengine的中文文檔幾乎沒有,有的也是簡短的幾句介紹和使用.下面我就分享一下我在使用過程中所記錄下的一些筆記,可能有點亂.大家可以參考一下.

  安裝mongoengine

  ?

1

2

easy_install pymongo # 依賴庫

easy_install mongoengine

  基本使用

  ?

1

2

3

4

5

6

7

8

9

10

11

12

13

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使用很類似,所以也不解釋什麼.

  插入

  ?

1

2

cate = Categories(name="Linux") # 如果required為True則必須賦予初始值,如果有default,賦予初始值則使用預設值

cate.save() # 儲存到資料庫

  查詢和更新

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

  ?

1

2

3

4

5

6

7

8

# 返回集合裡的所有文檔對象的列表

cate = Categories.objects.all()

 

# 返回所有符合查詢條件的結果的文檔對象列表

cate = Categories.objects(name="Python")

# 更新查詢到的文檔:

cate.name = "LinuxZen"

cate.update()

  查詢數組 預設查詢數組"="代表的意思是in:

  ?

1

2

3

4

5

6

7

8

9

10

11

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 引用欄位:

  通過引用欄位可以通過文檔直接擷取引用欄位引用的那個文檔:

  ?

1

2

3

4

5

6

7

8

9

10

11

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)

  插入引用欄位

  ?

1

2

3

4

cate =Categories(name="Linux")

cate.save()

post = Posts(title="Linuxzen.com", content="Linuxzen.com",tags=["Linux","web"], categories=cate)

post.save()

  通過引用欄位直接擷取引用文檔對象

  一般文檔查詢會返回一個列表(儘管只有一個結果),我們想要獲得一個文檔對象可以使用索引擷取第一個文檔對象,但是mongoengine建議使用first()來擷取第一個:

  ?

1

2

3

4

>>> cate = Posts.objects.all().first().categories

>>> cate

 

>>> cate.name

  u'Linux'

  查詢包含Linux分類的文章

  ?

1

2

>>> cate = Categories.objects(name="Linux").first()

>>> Posts.objects(categories=cate)

  EmbeddedDocument 嵌入文檔

  繼承EmbeddedDocument的文檔類就是嵌入文檔,嵌入文檔用於嵌入其他文檔的EmbeddedDocumentField 欄位,比如上面例子的tags欄位如果改成嵌入文檔的話可以將Posts文檔類改成如下方式:

  ?

1

2

3

4

5

6

class Posts(Document):

 

title = StringField(max_length=100, required=True)

content = StringField(required=True)

tags = ListField(EmbeddedDocumentField('Tags')required=True)

categories = ReferenceField(Categories)

  還需要添加一個Tags嵌入文檔類:

  ?

1

2

3

class Tags(EmbeddedDocument):

name = StringField()

date = DateTimeField(default=datetime.now())

  我們像如下方式插入Posts文檔中的Tags

  ?

1

2

3

4

5

6

7

8

9

10

11

>>> 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

  時間段查詢

  ?

1

2

3

4

5

6

7

8

9

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用於分區

  ?

1

2

3

4

5

6

7

8

9

10

11

12

13

# 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操作符

  ?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

# 更新嵌入文檔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")

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.