1.單字段索引
原文鏈接:https://docs.mongodb.com/manual/core/index-single/
MongoDB爲文檔集合中的任何字段提供完整的索引支持 。默認情況下,所有集合在_id字段上都有索引,應用程序和用戶可以添加其他索引以支持重要的查詢和操作。
本文檔描述了單個字段的升序/降序索引。
1.1 在單個字段上創建升序索引
如: records集合,它包含文檔如下:
{
"_id": ObjectId("570c04a4ad233577f97dc459"),
"score": 1034,
"location": { state: "NY", city: "New York" }
}
在records集合的score字段上創建升序索引:
db.records.createIndex( { score: 1 } )
索引規範中字段的值描述了該字段的索引類型。例如,值爲1爲按對items升序排序的索引。值爲-1指定對item降序排序的索引。有關其他索引類型,請參閱 index types.。
如上索引支持在score字段上選擇查詢,例如:
db.records.find( { score: 2 } )
db.records.find( { score: { $gt: 10 } } )
1.2 嵌入式字段上創建索引
在嵌入文檔中的字段上創建索引,就像文檔中的索引頂級字段一樣。嵌入字段上的索引與 i索引在嵌入式文檔上不同,嵌入文檔中的索引包括索引中嵌入文檔的最大內容,直到最大的index size。相反,索引在嵌入式字段上允許使用“點符號”來表示嵌入式文檔。
如: records集合,它包含文檔如下:
{
"_id": ObjectId("570c04a4ad233577f97dc459"),
"score": 1034,
"location": { state: "NY", city: "New York" }
}
以下操作在location.state 字段上創建索引:
db.records.createIndex( { "location.state": 1 } )
創建的索引將支持在字段上選擇的查詢 location.state,例如:
db.records.find( { "location.state": "CA" } )
db.records.find( { "location.city": "Albany", "location.state": "NY" } )
1.3 在嵌入式文檔上創建索引
在整個嵌入式文檔上創建索引。
如: 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作爲規範來指定索引。這對索引結果沒有任何影響。
2.複合索引
MongoDB支持複合索引,其中單個索引對集合文檔中多個字段[1]的引用。下圖說明了兩個字段的複合索引示例:
[1] 對於複合索引最多支持32個字段
複合索引可以支持在多個字段上匹配的查詢。
2.1創建複合索引
創建複合索引,使用如下語句:
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 } } )
有關詳細信息,請參閱Prefixes。
2.2 排序順序
索引以升序(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 } )
有關排序順序和複合索引的詳細信息,請參閱 使用索引對查詢結果排序。
2.3 前綴
索引前綴是索引字段的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.4 索引交集
從2.6版開始,MongoDB可以使用索引交集來完成查詢。選擇創建支持查詢或依賴索引交集,取決於系統的細節。有關詳細信息,請參見 索引交集和複合索引。
2.5其他注意事項
如果集合包含大量數據,並且您的應用程序需要能夠在構建索引時訪問數據,請考慮在後臺構建索引,如 Background Construction。
要爲副本集構建或重建索引,請參閱 Build Indexes on Replica Sets.。
某些驅動程序可以使用NumberLong(1)而不是 1作爲規範來指定索引。這對索引結果沒有任何影響。