如何修改MONGODB欄位的數組,不用整個欄位修改

來源:互聯網
上載者:User

標籤:blog   os   io   使用   for   資料   div   cti   sp   

很好的一點就是,資料庫不需要先建立,在串連後,如果進行插入資料操作,系統可以自己建立,我們假設一個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”,則如果沒有找到匹配的文檔,就會在匹配的基礎上建立一個文檔,具體執行個體就不講了。

現在使用Python來插入,修改資料已經講完,後面會繼續講解強大的查詢功能和彙總功能。等待下一篇吧。

如何修改MONGODB欄位的數組,不用整個欄位修改

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.