《mongodb入門》讀書筆記下載:
http://download.csdn.net/detail/ch717828/9833847 MongoDB的索引 查看索引
db.test_table.getIndexes() 建立索引(1表示升序,-1表示降序)
db.test_table.ensureIndex({x:1})
索引的種類
_id索引
_id索引是絕大多數集合預設建立的索引,對於每個插入資料MongoDB都會自動產生一條唯一的_id欄位
單鍵索引
單鍵是最普通的索引
db.test_table.ensureIndex({x:1})
多鍵索引
在單鍵索引的基礎上,多鍵索引的值有多個記錄,例如數組
db.test_table.insert({x:[1,2,3,4,5]})
對於這條插入記錄來講,mongodb即為x建立了一個多鍵索引
複合索引
使用多個鍵作為索引
db.test_table.ensureIndex({x:1,y:1})
到期索引
在一段時間後會到期的索引,在索引到期後,相應的資料會被刪除。 這適合儲存一些在一段時間之後會失效的資料比如使用者的登陸資訊、儲存的日誌
db.test_table.ensureIndex({y:1},{expireAfterSeconds:30})db.test_table.insert({y:new Date()})db.test_table.insert({y:1})
觀察一段時間後會發現,y的值為 new Date()的記錄被自動刪除,y的值為1的值沒有被刪除。因此
儲存在到期索引欄位的值必須是指定的時間類型(ISODate或者ISODate數組,不能使用時間戳)。如果制定了ISODate數組,則按照數組中的最小的時間進行刪除。此外,到期索引不能是複合索引。刪除時間不是精確的(刪除過程由背景程式定時執行,而且刪除過程也需要時間,因此存在誤差)
全文索引
建立全文索引(每個資料集合只允許建立一個全文索引)
db.test_table.ensureIndex({key:"text"}) db.test_table.ensureIndex({key_1:"text",key_2:"text"}) db.test_table.ensureIndex({"$**":"text"}) #$**表示在所有的字串欄位上建立一個全文索引。
使用全文索引
db.test_table.insert({"article":"abcd abcd abcd"}) db.test_table.insert({"article":"11 22 33"}) db.test_table.ensureIndex({"article":"text"})db.test_table.find({$test:{$search:"abcd"}})db.test_table.find({$test:{$search:"abcd 11"}}) db.test_table.find({$test:{search:"abcd -11"}}) #包含abcd但不包含11db.test_table.find({$test:{$serach:"\"abcd\" \"11\" "}}) #即包含abcd又包含11db.test_table.find({$test:{$search:"abcd 1234"}},{score:{$meta:"textScore"}}) #全文索引相似性
地理位置索引
2D平面地理位置索引
db.test_location.ensureIndex({"w":"2d"}) #建立2D平面地理位置索引db.test_location.insert({w:[100,150]}) #插入記錄db.test_location.find({w:{$near:[1,1]}}) #尋找距離[1,1]最近的點(預設返回前100個)db.test_location.find({w:{$near:[1,1],$maxDistance:10}}) #尋找距離[1,1]距離不超過10的點db.test_location.find({w:{$geoWithin:{$box:[[0,0],[3,3]]}}}) #尋找矩形[ [0,0],[3,3] ] 內的點db.test_location.find({w:{$geoWithin:{$center:[[0,0],5]}}}) #尋找圓心[0,0]半徑為5的圓內的點db.test_location.find({w:{$geoWithin:{$polygon:[[0,0],[0,1],[2,2],[3,3]]}}}) #尋找多邊形[[0,0],[0,1],[2,2],[3,3]]內的點db.runCommand({geoNear:"test_location",near:[1,2],$maxDistance:10,num:2}) #尋找test_location中,距離[1,2]最大距離不超過10的2條記錄
2D球面地理位置索引
索引的名字
db.test_table.ensureIndex({x:1,y:1,z:1},{name:"normal})
索引的唯一性
db.test_table.ensureIndex({m:1,n:1},{unique:true})db.test_table.insert({m:1,n:2}) #插入成功db.test_table.insert({m:1,n:2}) #插入失敗,鍵衝突
索引的稀疏性(稀疏性為true表示不為不存在的欄位建立索引)
db.test_table.ensureIndex({x:1},{sparse:true})
不可以在稀疏索引上尋找不存在的記錄,例:
“`
db.test_table.insert({m:1})
db.test_table.insert({n:1})
db.test_table.find({m:{exists:true}}) #尋找m存在的記錄
db.test_table.ensureIndex({m:1},{sparse:true}) #建立稀疏索引
db.test_table.find({m:{exists:true}}) #尋找m存在的記錄 db.test_table.ensureIndex({m:1},{sparse:true}) #建立稀疏索引 db.test_table.find({m:{exists:false}}) #尋找m不存在的記錄,依然找出m,這是稀疏索引的問題
db.test_table.find({m:{$exists:false}}).hind(“m_1”) #可以實現尋找m不存在的記錄
“` 索引構建情況分析
mongostat: 查看mongodb運行狀態的程式
./bin/mongostat --hlep #查看mongostat協助./bin/mongostat -h 127.0.0.1:12345 #查看當前系統的運行情況(如查看每秒有多少寫入)
explain: 顯示一次查詢的詳細資料
db.test_table.find({x:1}).explain();
MongoDB安全
開啟MongoDB的鑒權
vim conf/mongod.conf
port = 12345dbpath = datalogpath = log/mongod.logfork = trueauthor = true ```使用createUser建立使用者
db.createUser({user:”testUser”,pwd:”testUser”,roles:[{role:”userAdmin”,db:”admin”},{role:”read”,db:”test”}]}) #建立testUser使用者,對admin有userAdmin許可權,對test有read許可權
“` 問題 多鍵索引的作用
多鍵索引與單鍵索引在使用方式上有很大區別,在單鍵索引的基礎上,若插入的值為數組,則MongoDB為其建立一個多鍵索引。查詢時,使用多鍵數組中的任意一個值均可以找到該條記錄。