本文地址:http://www.cnblogs.com/egger/archive/2013/05/01/3053239.html 歡迎轉載 ,請保留此鏈接๑•́ ₃•̀๑!
本文介紹數據庫的4個基本操作:創建、讀取、更新和刪除(CRUD)。
接下來的數據庫操作演示,我們使用MongoDB自帶簡潔但功能強大的JavaScript shell,MongoDB shell是一個獨立的DB客戶端(它也是功能完備的JavaScript解釋器 可以運行任何JavaScript程序),MongoDB shell的使用介紹請閱讀博文《NoSQL學習之路(三):MongoDB Shell的使用》。
CRUD
1.C 創建
insert函數添加一個文檔到集合里面。
直接將文檔作為參數:
>db.post.insert({"title":"Ex.1"})
或者將文檔賦值給變量,變量作為方法的參數。
下面我們添加一篇文章。首先,創建一個局部變量post,JavaScript對象作為文檔的內容的賦值給post。里面會有"title","author","content"和"date"等鍵值。
使用count()查詢集合中文檔條數:
當我們成功的插入一條文檔到集合中后,我們會發現多了一個鍵"_id"和自動生成的ObjectId類型值。[詳情:MongoDB的ObjectID]
當插入多個文檔到一個集合的時候,請使用批量插入會快一些。批量插入能傳遞一個由文檔構成的數組給數據庫。這樣避免了許多零碎的請求所帶來的開銷。
要是只是導入原始數據(例如,從MySQL中導入 ),可以使用命令行工具,如mongoimport,而不是使用批量插入。另一方面,可以用它在存入MongoDB之前對數據做一些小的修整(轉換日期成為日期類型,或添加自定義的"_id"所以批量插入對導入數據來說也是有用的。
當執行插入的時候,使用的驅動程序會將數據轉換成BSON的形式,然后將其送入數據庫。數據庫解析BSON,檢驗是否包含"_id"鍵並且文檔不超過4MB。要查看doc文檔轉為BSON的大小(以字節為單位),在shell中運行 Object.bsonsize(doc)即可。
MongoDB在插入時並不執行代碼,不做別的數據驗證,就只是簡單地將文檔原樣存入數據庫中.雖然會導致插入無效的數據,但是它能讓數據庫更加安全,遠離注入式攻擊。
2.R讀取
find會返回集合里面所有的文檔。findOne(注意大小寫 findone 是無效的)查看一個文檔。
find和findOne可以接受査詢文檔形式的限定條件。這將通過査詢限制匹配的文檔。使用find時,shell自動顯示最多20個匹配的文檔,但可以獲取更多文檔。
3.U更新
更新操作是原子的:若是兩個更新同時發生,先到達服務器的先執行,接着執行另外的。
update接受(至少)兩個參數:第一個是要更新文檔的限定條件,第二個是新的文檔。
注意:若是集合中有多個文檔匹配查詢條件,更新時會查詢條件匹配了,然后更新的時候由於第二個參數的存在就產生重復的"_id"值,數據庫會報錯。限定條件盡量只能篩選出一條文檔記錄來。
假設決定給我們先前寫的文章增加標簽,則需要增加一個新的鍵,對應的值是存放標簽的數組。
第一步修改變量post,增加"tags"鍵:
shell輸入post回車,post變量中文檔值已經包含了tags數組了。
使用update方法更新文檔后,文檔中便有了"tags"鍵的內容。
4.D刪除
remove用來從數據庫中永久性地刪除文檔,不能回復和撤銷。
在不使用參數進行調用的情況下,它會刪除一個集合內的所有文檔,不會刪除集合本身,原有的索引也會保留。。
>db.posts.remove()
它也可以接受一個文檔以指定限定條件作為參數。現在集合中只有一條文檔記錄,我們指定限定條件進行刪除操作::
集合現在又是空的了。
如果要清除整個集合,直接刪除集合(然后重建索引)會更快,使用drop_collection函數。
>>db.drop_collection(collection_name)
Objectld
官方wiki:http://docs.mongodb.org/manual/reference/object-id/
當我們成功的插入一條文檔到集合中后,我們會發現多了一個鍵"_id"和自動生成的ObjectId類型值。通常會在客戶端由驅動程序完成。原因如下:
- MongoDB的設計理念:能從服務器端轉移到驅動程序來做的事,就盡量轉移。擴展應用層也要比擴展數據庫層容易得多。將事務交由客戶端來處理,就減輕了數據庫擴展的負擔。
- 在客戶端生成Objectld,驅動程序能夠提供更加豐富的API。
集合中每個文檔都有唯一的"_id"值,來確保集合里面每個文檔都能被唯一標識。Objectld是"_id"的默認類型,它是一種輕量型的,不同的機器都能用全局唯一的同種方法輕量的生成它。mongodb從開始設計就被定義為分布式數據庫,處理多個節點是一個核心要求。若采用傳統的自增主鍵策略,在多台服務器上同步自動增加主鍵既費力又費時。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
時間戳 | 機器名 | PID | 計數器 |
ObjectId占用12字節的存儲空間,每個字節兩位十六進制數字,是一個24位的字符串。由“時間戳” 、“機器名”、“PID號”和“計數器”組成。使用機器名的好處是在分布式環境中能夠避免單點計數的性能瓶頸。使用PID號的好處是支持同一機器內運行多個mongod實例。最終采用時間戳和計數器的組合來保證唯一性。
1.時間戳 4個字節。從標准紀元開始,單位為秒。
- 時間戳,與隨后的5個字節(機器名+PID)組合起來,提供了秒級別的唯一性。
- 由於時間戳在前,這意味着Objectld大致會按照插入的順序排列,這對於某些方面很有用,如將其作為索引提高效率,但是這個是沒有保證的。
- 這4個字節也隱含了文檔創建的時間。絕大多數驅動都會公開一個方法從Objectld獲取這個信息。
2.機器名 3個字節。所在主機的唯一標識符。通常是機器主機名的散列值,機器名通過Md5加密后取前三個字節。
3.PID 2個字節。為了確保在同一台機器上並發的多個進程產生的Objectld是唯一的,所以加上進程標識符(PID).注意到每次重啟mongod進程后PID號通常會發生變化就可以了。
前9字節保證了同一秒鍾不同機器不同進程產生的Objectld是唯一的。
4.計數器 3個字節,表示的取值范圍就是256*256*256=16777216。一個自動增加的計數器,確保相同進程同一秒產生的Obj ectld也是不一樣的同一秒鍾最多允許每個進程擁有2563 (16 777 216)不同的Objectld。
MongoDB的Python驅動
python環境下載: http://www.python.org/download/
pymongo驅動下載: https://pypi.python.org/pypi/pymongo/
window環境下,pymongo選擇類型為MS Windows installer。同時注意對應的python版本和系統(32or 64bit).需事先安裝好python環境,pymongo檢測到python安裝路徑,只需下一步到完成即可。
然后打開python命令行控制台程序。
下面是官方提供的基本示例:
創建連接
>>> import pymongo >>> client = pymongo.MongoClient("localhost", 27017)
切換數據庫 >>> db = client.test
打印數據庫名稱
>>> db.name u'test' 獲取集合
>>> db.my_collection Collection(Database(MongoClient('localhost', 27017), u'test'), u'my_collection')
插入文檔 >>> db.my_collection.save({"x": 10}) ObjectId('4aba15ebe23f6b53b0000000') >>> db.my_collection.save({"x": 8}) ObjectId('4aba160ee23f6b543e000000') >>> db.my_collection.save({"x": 11}) ObjectId('4aba160ee23f6b543e000002')
查看集合中的一條文檔記錄 >>> db.my_collection.find_one() {u'x': 10, u'_id': ObjectId('4aba15ebe23f6b53b0000000')}
下面我們使用python語言往集合中插入1000000條文檔記錄,然后再清空該集合,並顯示清空操作花費時間。
下面演示將使用Python shell.
新建.py文件。
import pymongo client = pymongo.MongoClient("localhost", 27017) db = client.test #查看test數據庫中集合信息 print (db.collection_names()) #連接到my_collection集合 print (db.my_collection) #清空my_collection集合文檔信息 db.my_collection.remove() #顯示my_collection集合中文檔數目 print (db.my_collection.find().count()) #插入1000000條文檔信息 for i in range(1000000): db.my_collection.insert({"test":"tnt","index":i}) #顯示my_collection集合中文檔數目 print ('插入完畢,當前文檔數目:') print (db.my_collection.find().count())
通過Python shell打開該文件,然后按“F5”或者點擊“run”->"run module",運行該文件,執行操作。
運行后,python shell 光標閃爍,因為數量較多,等待片刻。
文檔成功插入后:
運行下面的代碼,執行清空集合操作。
import time from pymongo import Connection db=Connection().test collection = db.my_collection start = time.time() collection.remove() collection.find_one() total = time.time()-start print ("刪除1000000條文檔共計耗時:%d seconds" % total)
結果如下:
參考:
4. pymongo 使用小結