日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python 连 mongodb

發(fā)布時(shí)間:2024/1/17 python 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 连 mongodb 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

這幾天在學(xué)習(xí)Python Web開(kāi)發(fā),于是做準(zhǔn)備做一個(gè)博客來(lái)練練手,當(dāng)然,只是練手的,博客界有WordPress這樣的好玩意兒,何必還自己造車呢?決定使用Tornado這個(gè)框架,然后數(shù)據(jù)庫(kù)方面決定順便熟悉一下MongoDB這樣的非關(guān)系型數(shù)據(jù)庫(kù)。Python讓我覺(jué)得輕松,再和MongoDB搭配上,那感覺(jué)真是好。

下面就談?wù)凱ython操作MongoDB的一些基本用法,先介紹一下MongoDB,這是現(xiàn)在風(fēng)頭正勁的NoSQL數(shù)據(jù)庫(kù),沒(méi)有關(guān)系數(shù)據(jù)庫(kù)那種表之類的概念,就像Python中的字典一樣,一個(gè)鍵對(duì)應(yīng)一個(gè)值,然后這些鍵值組成一個(gè)文檔,然后文檔組成一個(gè)集合,集合再組成一個(gè)數(shù)據(jù)庫(kù),類型十分豐富,使用Python操作MongoDB需要安裝MongoDB的Python驅(qū)動(dòng),安裝完成后,就可以和我一起開(kāi)始了。

啟動(dòng)數(shù)據(jù)庫(kù)(具體方法不是本文重點(diǎn)),連接數(shù)據(jù)庫(kù)。

1 >>> from pymongo import Connection #導(dǎo)入模塊
2 >>> con = Connection()
3 >>> db = con.test #連接test數(shù)據(jù)庫(kù)
4 >>> posts = db.post #連接test中的post集合,相當(dāng)于MySQL中的表

很好的一點(diǎn)就是,數(shù)據(jù)庫(kù)不需要先建立,在連接后,如果進(jìn)行插入數(shù)據(jù)操作,系統(tǒng)可以自己創(chuàng)建,我們假設(shè)一個(gè)post集合,里面是一些博客文章組成的文檔。下面先插入幾篇文章做實(shí)驗(yàn)。

1 >>> import datetime
2 >>> post1 = {"title":"I Love Python",
3 "slug":"i-love-python",
4 "author":"SErHo",
5 "content":"I Love Python....",
6 "tags":["Love","Python"],
7 "time":datetime.datetime.now()}
8
9 >>> post2 = {"title":"Python and MongoDB",
10 "slug":"python-mongodb",
11 "author":"SErHo",
12 "content":"Python and MongoDB....",
13 "tags":["Python","MongoDB"],
14 "time":datetime.datetime.now()}
15
16 >>> post3 = {"title":"SErHo Blog",
17 "slug":"serho-blog",
18 "author":"Akio",
19 "content":"SErHo Blog is OK....",
20 "tags":["SErHo","Blog"],
21 "time":datetime.datetime.now()}
22
23 >>> posts.insert(post1)
24 >>> posts.insert(post2)
25 >>> posts.insert(post3)

在插入一個(gè)文檔時(shí),MongoDB會(huì)自動(dòng)給每個(gè)文檔增加一個(gè)”_id”的鍵,這個(gè)鍵是通過(guò)復(fù)雜計(jì)算出來(lái)的,不會(huì)重復(fù),類似于下面這樣的:

1 ObjectId('4ea0207dd483050fe8000001')

增加數(shù)據(jù)就是這樣的簡(jiǎn)單,不需要事先定義文檔的機(jī)構(gòu),每個(gè)文檔的結(jié)構(gòu)也可以不一樣,上面我舉的例子是一樣的,這可以根據(jù)實(shí)際需求來(lái)設(shè)置,我這個(gè)是為了好講解下面的。插入過(guò)后,肯定最先的是查詢,下面查詢出post集合里面的所有文檔:

1 >>> posts = posts.find()
2 >>> count = posts.count()
3 >>> for post in posts:
4 print post

數(shù)據(jù)庫(kù)使用游標(biāo)來(lái)返回find的結(jié)果,游標(biāo)上有多種方法,比如上面的count(),就可以得到查詢到的文檔總數(shù)。這個(gè)例子將返回”count=3″和上面的那三篇文檔。更多查詢方法在后面將講解,這些方法更加強(qiáng)大。

插入過(guò)后可能發(fā)現(xiàn)需要修改,于是下面講解一些修改的方法。如果需要大幅度的修改,什么是大幅度的修改呢,比如把post1的title,slug,author等都修改了,我的理解就是大于一個(gè)鍵的修改就叫大幅修改。修改一個(gè)東西,你得先找到他,所以查詢方法就很重要了,不幸的是,這個(gè)準(zhǔn)備后面才將。我們先隨便查找一個(gè)來(lái)修改吧。

1 >>> post = posts.find_one({"slug":"python-mongodb"})
2 >>> post["author"]
3 u'SErHo'
4 >>> post["author"] = "HaHa Lu"
5 >>> post["title"] = "Test Update"
6 >>> post["title"] = "Test Update"
7 >>> post["_id"]
8 ObjectId('4ea0207dd483050fe8000001')
9 >>> posts.update({"_id":post["_id"]},post)
10 >>> post = posts.find_one({"_id":post["_id"]})
11 >>> print post
12 {u'author': u'HaHa Lu', u'title': u'Test Update',
13 u'tags': [u'Python', u'MongoDB'],
14 u'content': u'Python and MongoDB....',
15 u'time': datetime.datetime(2011, 10, 20, 21, 21, 52, 818000),
16 u'_id': ObjectId('4ea0207dd483050fe8000001'),
17 u'slug': u'python-mongodb'}

首先我們根據(jù)slug來(lái)獲得一篇文章,然后可以通過(guò)Python字典訪問(wèn)方法得到鍵的值,然后重新設(shè)置,再對(duì)post集合進(jìn)行更新,在對(duì)整個(gè)集合進(jìn)行更新時(shí),你得先匹配要更改的文檔,利用_id這個(gè)屬性來(lái)更新是比較常用的方法,因?yàn)槟闫渌牧?#xff0c;這個(gè)可改不了。在執(zhí)行update中最常見(jiàn)的錯(cuò)誤就是限制的條件找到了多個(gè)文檔,如果這樣,數(shù)據(jù)庫(kù)就不會(huì)更新這個(gè)集合,所有最好使用_id來(lái)匹配。

如果只更新一個(gè)鍵呢,那就不用這么大費(fèi)周折了,可以使用”$set”這個(gè)修改器,指定一個(gè)鍵,如果不存在,就可以創(chuàng)建。比如我要繼續(xù)更新上面那篇文章的content,可以這樣做(記住,修改它,必須先找到它,這里我利用上面查詢到的_id值來(lái)找):

1 >>> posts.update({"_id":post["_id"]},{"$set":
2 {"content":"Test Update SET...."}})

MongoDB的修改是很強(qiáng)大的,你可以把數(shù)據(jù)類型也給改了,比如把tags的數(shù)組改成普通的字符串?!?set”過(guò)后又想刪除這個(gè)鍵,可以使用”$unset”。如果我的這個(gè)post里面有一個(gè)鍵是views,即文章訪問(wèn)的次數(shù),我想在每次訪問(wèn)這個(gè)文章后給它的值增加1,這該怎么辦?于是”$inc”修改器出場(chǎng)了,這個(gè)可以用來(lái)增加已有鍵的值,如果沒(méi)有,則創(chuàng)建它,類似的用法是:

1
2 >>> posts.update({"_id":post["_id"]},{"$inc": {"views":1}})

如果想修改tags這個(gè)數(shù)組里面的內(nèi)容怎么辦?有一個(gè)辦法就是用$set整體修改,但只是改里面的一些元素呢,MongoDB準(zhǔn)備好了用于數(shù)組的修改器。比如,想要在tags里面加一個(gè)”Test”,這需要使用”$push”,它可以在數(shù)組末尾添加一個(gè)元素:

1 >>> posts.update({"_id":post["_id"]},{"$push":{"tags":"Test"}})

為了避免加入了重復(fù)的,可以將”$push”改為使用”$addToSet”,如果需要添加多個(gè)值,可以配合”$each”來(lái)使用,這樣就可以添加不重復(fù)的進(jìn)去,如下面:

1
2 >>> posts.update({"_id":post["_id"]},{"$addToSet":
3 {"tags":{"$each":["Python","Each"]}}})

說(shuō)完了添加,下面是刪除,可以把數(shù)組看成棧和隊(duì)列,使用”$pop”來(lái)操作,比如上面的:

1 >>> posts.update({"_id":post["_id"]},{"$pop":{"tags":1}})

這個(gè)會(huì)刪除tags里面最后一個(gè),改成-1則刪除第一個(gè)??梢允褂谩?pull”來(lái)刪除數(shù)組中指定的值,它會(huì)刪除數(shù)組中所有匹配的值。如何修改其中的一個(gè)值呢?可以先刪除掉,再增加一個(gè)進(jìn)去,還有就是直接定位修改。比如tags數(shù)組中,”Python”是第一個(gè),想把它改成”python”,可以通過(guò)下標(biāo)直接選擇,就是tags[0],然后使用上面的”$set”等修改器,如果不確定可以使用$來(lái)定位:

1 >>> posts.update({"tags":"MongoDB"},{"$set":{"tags.$":"Hello"}})

這個(gè)將先搜索tags中滿足”MongoDB”的,如果找到,就把它修改為”Hello”??梢钥吹缴厦娴膗pdate這個(gè)函數(shù)已經(jīng)有兩個(gè)參數(shù)了,它還有第3個(gè)參數(shù)upsert,如果設(shè)為”True”,則如果沒(méi)有找到匹配的文檔,就會(huì)在匹配的基礎(chǔ)上新建一個(gè)文檔,具體實(shí)例就不講了。

源鏈接:http://serholiu.com/python-mongodb

轉(zhuǎn)載于:https://www.cnblogs.com/mengyixuan/p/3933767.html

總結(jié)

以上是生活随笔為你收集整理的python 连 mongodb的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。