Python搭配MongoDB使用方法

原文地址:http://serholiu.com/python-mongodb

MongoDB

下面就談談Python操作MongoDB的一些基本用法,先介紹一下MongoDB,這是現在風頭正勁的NoSQL數據庫,沒有關係數據庫那種表之類的概念,就像Python中的字典一樣,一個鍵對應一個值,然後這些鍵值組成一個文檔,然後文檔組成一個集合,集合再組成一個數據庫,類型十分豐富,使用Python操作MongoDB需要安裝MongoDB的Python驅動,安裝完成後,就可以和我一起開始了。

啓動數據庫(具體方法不是本文重點),連接數據庫。

1     >>> from pymongo import Connection #導入模塊
2     >>> con = Connection()
3     >>> db = con.test #連接test數據庫
4     >>> posts = db.post #連接test中的post集合,相當於MySQL中的表

很好的一點就是,數據庫不需要先建立,在連接後,如果進行插入數據操作,系統可以自己創建,我們假設一個post集合,裏面是一些博客文章組成的文檔。下面先插入幾篇文章做實驗。

 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)

在插入一個文檔時,MongoDB會自動給每個文檔增加一個”_id”的鍵,這個鍵是通過複雜計算出來的,不會重複,類似於下面這樣的:

1     ObjectId('4ea0207dd483050fe8000001')

增加數據就是這樣的簡單,不需要事先定義文檔的機構,每個文檔的結構也可以不一樣,上面我舉的例子是一樣的,這可以根據實際需求來設置,我這個是爲了好講解下面的。插入過後,肯定最先的是查詢,下面查詢出post集合裏面的所有文檔:

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

數據庫使用遊標來返回find的結果,遊標上有多種方法,比如上面的count(),就可以得到查詢到的文檔總數。這個例子將返回”count=3″和上面的那三篇文檔。更多查詢方法在後面將講解,這些方法更加強大。

插入過後可能發現需要修改,於是下面講解一些修改的方法。如果需要大幅度的修改,什麼是大幅度的修改呢,比如把post1的title,slug,author等都修改了,我的理解就是大於一個鍵的修改就叫大幅修改。修改一個東西,你得先找到他,所以查詢方法就很重要了,不幸的是,這個準備後面纔將。我們先隨便查找一個來修改吧。

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

首先我們根據slug來獲得一篇文章,然後可以通過Python字典訪問方法得到鍵的值,然後重新設置,再對post集合進行更新,在對整個集合進行更新時,你得先匹配要更改的文檔,利用_id這個屬性來更新是比較常用的方法,因爲你其他改了,這個可改不了。在執行update中最常見的錯誤就是限制的條件找到了多個文檔,如果這樣,數據庫就不會更新這個集合,所有最好使用_id來匹配。

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

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

MongoDB的修改是很強大的,你可以把數據類型也給改了,比如把tags的數組改成普通的字符串。”$set”過後又想刪除這個鍵,可以使用”$unset”。如果我的這個post裏面有一個鍵是views,即文章訪問的次數,我想在每次訪問這個文章後給它的值增加1,這該怎麼辦?於是”$inc”修改器出場了,這個可以用來增加已有鍵的值,如果沒有,則創建它,類似的用法是:

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

如果想修改tags這個數組裏面的內容怎麼辦?有一個辦法就是用$set整體修改,但只是改裏面的一些元素呢,MongoDB準備好了用於數組的修改器。比如,想要在tags裏面加一個”Test”,這需要使用”$push”,它可以在數組末尾添加一個元素:

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

爲了避免加入了重複的,可以將”$push”改爲使用”$addToSet”,如果需要添加多個值,可以配合”$each”來使用,這樣就可以添加不重複的進去,如下面:

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

說完了添加,下面是刪除,可以把數組看成棧和隊列,使用”$pop”來操作,比如上面的:

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

這個會刪除tags裏面最後一個,改成-1則刪除第一個。可以使用”$pull”來刪除數組中指定的值,它會刪除數組中所有匹配的值。如何修改其中的一個值呢?可以先刪除掉,再增加一個進去,還有就是直接定位修改。比如tags數組中,”Python”是第一個,想把它改成”python”,可以通過下標直接選擇,就是tags[0],然後使用上面的”$set”等修改器,如果不確定可以使用$來定位:

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

這個將先搜索tags中滿足”MongoDB”的,如果找到,就把它修改爲”Hello”。可以看到上面的update這個函數已經有兩個參數了,它還有第3個參數upsert,如果設爲”True”,則如果沒有找到匹配的文檔,就會在匹配的基礎上新建一個文檔,具體實例就不講了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章