標籤:mongodb 索引對象
MongoDB允許深入文檔內部,對嵌套欄位和數組建立索引;嵌套對象和數組欄位可以和複合索引中的頂級欄位一起使用,多數情況下與“正常”索引欄位的行為也是一致的。
一、索引嵌套文檔
例如,集合中的文檔如下格式,
> db.post.findOne({"username":"sid"}) { "_id" : ObjectId("54aff7f43bd1048e7b585e39"), "username" : "sid", "loc" : { "ip" : "1.2.3.4", "city" : "springfield", "state" : "ny" } } >
需要在“loc”的city上建立索引來提高這個loc.city欄位的查詢速度:
> db.post.ensureIndex({"loc.city":1}) { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 } >
利用這種方式可以建立任意深度的索引,例如可以在X.Y.Z.A.B.C上建立索引。
但是,針對子文檔“loc”上建立的索引,和建立在子文檔的某個欄位“loc.city”上的索引是不同的:
(1)對整個子文檔上建立的索引,只會提高整個子文檔的的查詢速度;也就是說只有在完全符合子文檔的查詢(包括欄位順序),子文檔索引才會起作用;
(2)只有查詢loc.city欄位,索引loc.city才會起作用,其他情況索引loc.city不起作用;
二、數組上的索引
(1)可以看得出在數組欄位上建立索引的代價比較大,因為每次的刪除,更新都會對每一個索引進行重新整理,太消耗伺服器的資源;
(2)可以針對數組欄位中的某一個元素做具體的單獨索引,減少索引的數量;例如,在數組欄位comments中的第九個元素中的votes上建立索引:
> db.post.ensureIndex({"comment.10.votes":1})
同樣,只有精確匹配comment.10.votes查詢,上述索引才會起到索引的作用。
三、多鍵索引
如果在數組欄位上建立索引,那麼這個索引稱為多鍵索引( multikey)。
多鍵索引用explain函數中可以看到“isMultikey”欄位的值為true,多鍵索引比非多鍵索引要慢一些;
本文出自 “緣隨心愿” 部落格,請務必保留此出處http://281816327.blog.51cto.com/907015/1601473
【MongoDB學習筆記23】MongoDB的索引對象和數組