(本文來源于我的工作筆記,是剛接觸Mongo時整理的)
1,mongodb是面向文檔類型的層次型資料庫,documents -> collections -> databases -> mongodb;
2,在需要存儲大資料量的情況下使用;
3,操作的語言是js,裡面的對象是js生成的,例如mongo,collection,而裡面的操作例如:find,sort,insert,update,remove和$等都是用js解析的;
4,mongodb本身可以說就是一個js解析器;
5,mongodb是一個免安裝的服務,和redis一樣,支援在指令行下運作,也支援背景單程序運作,隻需要使用-fork參數;
6,mongodb運作的指令是mongod -dbpath mypath,其中mypath是要指定的資料庫的目錄;
7,mongodb的bin目錄下還有一些常用工具,mongod是服務程式,mongo則是用戶端連接配接工具,mongostat是實時監控工具;
8,mongodb的性能測試報告中指出,mongodb的批量導入與批量導出的性能很高,而其并發處理的能力隻是一般,若并發數較大,則命中率會有所降低;
9,我目前使用java連接配接mongodb的方式有兩種:mongo-java-driver和spring-data-mongodb,都不難使用,後者支援spring;
10,mongodb裡預設有個主鍵叫_id,若插入的資料沒有指定一個具體的_id,mongodb則會自動生成一個ObjectId,由于mongodb的設計初衷是分布式,是以主鍵沒有自增的功能;
11,mongodb中插入操作有時會變成更新操作,當插入的_id和已經存在的_id相同時;
12,mongodb中判斷兩個document是否相同是根據_id的;
13,mongodb的分布式是由于支援分片(shard)功能,而其高性能的批量導入與導出是基礎;
14,分片就是取其某一子集;--------------MongoDB宏觀-------------
3,操作的語言是js,裡面的對象是js生成的,例如mongo,collection,而裡面的操作例如:find,sort,insert,update,remove,save和$等都是用js解析的;
11,mongodb中save操作有時會變成updata操作,當save的_id和已經存在的_id相同時;
14,分片就是取其某一子集;
--------------查詢與性能---------------
15,查詢區分大小寫(大小寫敏感),雖然可以使用正規表達式,但那樣會降低性能;
16,單個檔案的大小是有限制的(舊版是4M,新版是16M);
17,高速的寫入和更新的原因是沒有明确的錯誤通知(也就是不安全寫入),若需要安全寫入可用getLastError with 'j',0.1s/次儲存到日志;
18,(原文引用)MongoDB使用記憶體映射檔案并且每60秒向磁盤輸出一次通知,這就意味着最大程度上你可能丢失60秒加上向硬碟輸出通知這段時間内所有的資料。為了避免資料丢失,MongoDB從2.0版本起就添加了Journaling(預設情況下開啟)。當然Journaling會輕微的影響到性能,大約5%。但是對于多數人來說額外帶來的安全性肯定是物有所值的。
-------------查詢與索引------------------
19,最好要建立查詢中用到的鍵的索引,不然MongoDB會做整個表的掃描,那樣會影響查詢性能,索引的建立方式是db[.集合名].ensureIndex({"鍵名" : 1},{"background" : true});
20,某個鍵的索引當且僅當用該鍵查詢時才有用,對于用其他鍵查詢無用;
21,要盡可能少的建立索引,因為插入,更新和删除都會因為索引而帶來額外的開銷,同樣影響到性能;
22,使用{"background" : true}使建立索引的過程在背景完成,這樣資料庫不會阻塞建立索引時的所有請求;
23,删除索引(system.indexes中會有所有索引名),db.runCommand({"dropIndexes" : "集合名", "index" : "索引名"})
-----------------MongoDB聚合--------------
24,db.collection.count()傳回集合中的文檔數量;
25,db.runCommand({"distinct" : "集合名", "key" : "鍵名"}),用來找出指定鍵的所有不同值;
-----------------MongoDB操作--------------
26,db.collection.save()與db.collection.insert()的差別:insert有判斷主鍵(_id)是否存在,若存在則不做任何操作,而save則不做判斷,不存在則insert,存在則update;
27,db.collection.update()預設隻更新一條資料,若要更新多條,要加{"multi" : true};
28,背景入口:http://host:http:28017/,需要啟動時加-rest參數支援;
29,MongoDB通過db.eval(javascript代碼)在伺服器端執行javascript代碼;