MongoDB爲文檔集合中的任何字段提供完整的索引支持 。默認狀況下,全部集合在_id字段上都有索引,應用程序和用戶能夠添加其餘索引以支持重要的查詢和操做。mongodb
本文檔描述了單個字段的升序/降序索引。數據庫
如:records集合,它包含文檔以下:ui
{ "_id": ObjectId("570c04a4ad233577f97dc459"), "score": 1034, "location": { state: "NY", city: "New York" } }
在records集合的score字段上建立升序索引:spa
db.records.createIndex( { score: 1 } )
索引規範中字段的值描述了該字段的索引類型。例如,值爲1爲按對items升序排序的索引。值爲-1指定對item降序排序的索引。有關其餘索引類型,請參閱 index types。code
如上索引支持在score字段上選擇查詢,例如:排序
db.records.find( { score: 2 } ) db.records.find( { score: { $gt: 10 } } )
在嵌入文檔中的字段上建立索引,就像文檔中的索引頂級字段同樣。嵌入字段上的索引與 i索引在嵌入式文檔上不一樣,嵌入文檔中的索引包括索引中嵌入文檔的最大內容,直到最大的index size。相反,索引在嵌入式字段上容許使用「點符號」來表示嵌入式文檔。索引
如:records集合,它包含文檔以下:圖片
{ "_id": ObjectId("570c04a4ad233577f97dc459"), "score": 1034, "location": { state: "NY", city: "New York" } }
如下操做在location.state 字段上建立索引:ci
db.records.createIndex( { "location.state": 1 } )文檔
建立的索引將支持在字段上選擇的查詢 location.state,例如:
db.records.find( { "location.state": "CA" } ) db.records.find( { "location.city": "Albany", "location.state": "NY" } )
在整個嵌入式文檔上建立索引。
如:records集合,它包含文檔以下:
{ "_id": ObjectId("570c04a4ad233577f97dc459"), "score": 1034, "location": { state: "NY", city: "New York" } }
該location字段是一個嵌入式文檔,包含嵌入字段 city和state。如下命令在整個location 字段上建立索引:
db.records.createIndex( { location: 1 } )
如下查詢可使用該location字段上的索引:
db.records.find( { location: { city: "New York", state: "NY" } } )
注意
雖然查詢可使用索引,但結果集不包括上面的示例文檔。在嵌入文檔上執行等值匹配時,字段順序事項和嵌入文檔必須徹底匹配。有關查詢嵌入式文檔的更多信息,請參閱 查詢嵌入式文檔。
若是集合包含大量數據,而且您的應用程序須要可以在構建索引時訪問數據,請考慮在後臺構建索引,如 Background Construction。
要爲副本集構建或重建索引,請參閱 在副本集上構建索引。
某些驅動程序可使用NumberLong(1)而不是 1做爲規範來指定索引。這對索引結果沒有任何影響。
MongoDB支持複合索引,其中單個索引對集合文檔中多個字段[1]的引用。下圖說明了兩個字段的複合索引示例:
[1] 對於複合索引最多支持32個字段
複合索引能夠支持在多個字段上匹配的查詢。
建立複合索引,使用以下語句:
db.collection.createIndex( { <field1>: <type>, <field2>: <type2>, ... } )
索引規範中字段的值描述了該字段的索引類型。例如,值爲1對item進行升序排序的索引。值爲-1對item進行降序的索引。有關其餘索引類型,請參閱 索引類型。
注意:
沒法建立具備hashed索引類型的複合索引 。若是嘗試建立包含散列索引字段的複合索引,則會收到錯誤。
如:集合products,包含以下文檔:
{ "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases" }
在item和 stock字段上建立升序索引:
db.products.createIndex( { "item": 1, "stock": 1 } )
複合索引中列出的字段的順序很重要。索引首先按item字段值對文檔進行排序,而後對item字段的每一個值按照stock字段值進行排序。有關詳細信息,請參閱 排序順序
除了支持在全部索引字段上匹配的查詢以外,複合索引還能夠支持與索引字段的前綴匹配的查詢。也就是說,索引支持對item字段以及字段item和stock字段的查詢:
db.products.find( { item: "Banana" } ) db.products.find( { item: "Banana", stock: { $gt: 5 } } )
索引以升序(1)或降序(-1)排序順序存儲對字段的引用。對於單字段索引,鍵的排序順序可有可無,由於MongoDB能夠在任一方向上遍歷索引。可是,對於複合索引,排序順序決定索引是否能夠支持排序操做。
Events集合包含字段username和date。應用程序能夠發出返回結果的查詢,這些查詢首先按升序username值排序,而後按降序(即最近更新)date值排序,例如:
db.events.find().sort( { username: 1, date: -1 } )
或返回結果的查詢首先按降序username 值排序,而後按升序date值排序,例如:
db.events.find().sort( { username: -1, date: 1 } )
如下索引能夠支持這兩種排序操做:
db.events.createIndex( { "username" : 1, "date" : -1 } )
可是,上述索引不支持按升序username值排序,而後按升序date值排序, 以下所示:
db.events.find().sort( { username: 1, date: 1 } )
有關排序順序和複合索引的詳細信息,請參閱 使用索引對查詢結果排序。
索引前綴是索引字段的 beginning 子集。例如,複合索引:
{ "item": 1, "location": 1, "stock": 1 }
索引具備如下索引前綴:
{ item: 1 }
{ item: 1, location: 1 }
對於複合索引,MongoDB可使用索引來支持對索引前綴的查詢。所以,MongoDB能夠在如下字段中使用索引進行查詢:
Item字段,
Item字段和location字段
Item字段和location字段和stock字段
MongoDB索引支持查詢item和 stock字段,由於item字段對應於前綴。可是,索引在支持查詢方面效率不高,由於僅索引item和stock。
可是,MongoDB沒法使用索引來支持以下查詢,由於沒有item字段,所列出的字段沒法使用前綴索引:
Location字段,
Stock字段
Location字段和stock字段。
若是集合在在某個字段同時具備複合索引({ a: 1, b: 1 })和前綴索引({ a: 1 }),且兩個索引都沒有稀疏或惟一約束,則能夠刪除前綴上的索引({ a: 1 })。當須要使用前綴索引時,MongoDB可使用複合索引代替。
從2.6版開始,MongoDB可使用索引交集來完成查詢。選擇建立支持查詢或依賴索引交集,取決於系統的細節。有關詳細信息,請參見 索引交集和複合索引。
若是集合包含大量數據,而且您的應用程序須要可以在構建索引時訪問數據,請考慮在後臺構建索引,如 Background Construction。
要爲副本集構建或重建索引,請參閱 Build Indexes on Replica Sets 。
某些驅動程序可使用NumberLong(1)而不是 1做爲規範來指定索引。這對索引結果沒有任何影響。
譯者:莫微DBA一枚,關注數據庫發展,願爲之添磚加瓦。