MongoDB 索引(二)

4.索引交集

MongoDB可以使用多個索引的交集來實現查詢。一般情況下,每個指標的交集包含兩個指標;但是,MongoDB可以使用多個/嵌套的索引交叉點來解析查詢。
要說明索引交集,請考慮具有以下索引的集合訂單:

{ qty: 1 }
{ item: 1 }

MongoDB可以使用兩個索引的交集來支持以下查詢:

db.orders.find( { item: "abc123", qty: { $gt: 15 } } )

要確定MongoDB是否使用了索引交集,請運行explain();explain()的結果將包括一個and_ordered階段或一個AND_HASH階段。

4.1指數前綴的交集
使用索引交集,MongoDB可以使用整個索引或索引前綴的交集。索引前綴是複合索引的子集,由一個或多個從索引開始的鍵組成。

考慮一個具有以下索引的託收訂單:

{ qty: 1 }
{ status: 1, ord_date: -1 }

要完成下面的查詢,它指定了qty字段和status字段的條件,MongoDB可以使用兩個索引的交集:

db.orders.find( { qty: { $gt: 10 } , status: "A" } )

4.2 索引交集和複合索引
索引交集並不能消除創建複合索引的需要。然而,因爲兩個訂單列表(即列出了鍵的順序索引)和排序順序(升序或降序),物質複合索引,複合指數可能不支持查詢條件不包括前綴索引鍵或指定一個不同的排序順序。

例如,如果一個集合訂單有以下複合索引,並且狀態字段列在ord_date字段之前:

{ status: 1, ord_date: -1 }

複合索引可以支持以下查詢:

db.orders.find( { status: { $in: ["A", "P" ] } } )
db.orders.find(
   {
     ord_date: { $gt: new Date("2014-02-01") },
     status: {$in:[ "P", "A" ] }
   }
)

但不包括以下兩個查詢:

db.orders.find( { ord_date: { $gt: new Date("2014-02-01") } } )
db.orders.find( { } ).sort( { ord_date: 1 } )

但是,如果集合有兩個單獨的索引:

{ status: 1 }
{ ord_date: -1 }

這兩個索引可以單獨地或通過索引交集來支持前面提到的所有四個查詢。
創建支持查詢的複合索引還是依賴於索引交集,這取決於系統的具體情況。

4.3 索引交集和排序
當sort()操作需要一個完全獨立於查詢謂詞的索引時,不應用索引交集。
例如,orders集合有以下索引:

{ qty: 1 }
{ status: 1, ord_date: -1 }
{ status: 1 }
{ ord_date: -1 }

MongoDB不能使用索引交集進行以下查詢與排序:

db.orders.find( { qty: { $gt: 10 } } ).sort( { status: 1 } )

That is, MongoDB does not use the { qty: 1 } index for the query, and the separate { status:1 } or the { status: 1, ord_date: -1 } index for the sort.

However, MongoDB can use index intersection for the following query with sort since the index {status: 1, ord_date: -1 } can fulfill part of the query predicate.

db.orders.find( { qty: { $gt: 10 } , status: "A" } ).sort( { ord_date: -1 } )

5. 管理索引

這個頁面顯示瞭如何管理現有的索引。有關創建索引的說明,請參閱特定的索引類型頁。

5.1 查看現有索引
以下部分提供了查看集合或整個數據庫上現有索引的方法。

5.1.1 列出集合上的所有索引
要返回集合上所有索引的列表,請使用db. collections . getindexes()方法或驅動程序的類似方法。
例如,要查看人員集合上的所有索引,請運行以下命令:

db.people.getIndexes()

5.1.2 列出數據庫的所有索引
要列出數據庫中的所有收集索引,可以在mongo shell中使用以下操作:

db.getCollectionNames().forEach(function(collection) {
   indexes = db[collection].getIndexes();
   print("Indexes for " + collection + ":");
   printjson(indexes);
});

從3.0版本開始,MongoDB不支持直接訪問系統。索引集合,該集合以前用於列出數據庫中的所有索引。

5.1.3 列出特定類型的索引
要列出所有數據庫中所有集合的特定類型的所有索引(例如散列、文本),可以在mongo shell中使用以下操作:

// The following finds all hashed indexes

db.adminCommand("listDatabases").databases.forEach(function(d){
   let mdb = db.getSiblingDB(d.name);
   mdb.getCollectionInfos({ type: "collection" }).forEach(function(c){
      let currentCollection = mdb.getCollection(c.name);
      currentCollection.getIndexes().forEach(function(idx){
        let idxValues = Object.values(Object.assign({}, idx.key));

        if (idxValues.includes("hashed")) {
          print("Hashed index: " + idx.name + " on " + idx.ns);
          printjson(idx);
        };
      });
   });
});

5.2 刪除索引
MongoDB提供了兩種從集合中刪除索引的方法:

  • db.collection.dropIndex()和
  • db.collection.dropIndexes ()

5.2.1 刪除特定的指數

要刪除索引,請使用db.collection.dropIndex()方法。

例如,下面的操作刪除了accounts集合中tax-id字段上的升序索引:

db.accounts.dropIndex( { "tax-id": 1 } )

操作返回帶有操作狀態的文檔:

{ "nIndexesWas" : 3, "ok" : 1 }

其中nIndexesWas的值反映了刪除該索引之前索引的數量。
對於文本索引,將索引名傳遞給db.collection.dropIndex()方法。有關詳細信息,請參見使用索引名稱來刪除文本索引。

請注意:
從MongoDB 4.2開始,db.collection.dropIndexes()可以接受一個索引名數組。

5.2.2 刪除所有索引
還可以使用db.collection.dropIndexes()從集合中刪除除_id索引之外的所有索引。
例如,下面的命令從accounts集合中刪除所有索引:

db.accounts.dropIndexes()

這些shell幫助程序爲dropIndexes數據庫命令提供包裝器。對於這些操作,您的客戶機庫可能具有不同的或附加的接口。

5.3 修改索引
要修改現有索引,需要刪除並重新創建該索引。這個規則的例外是TTL索引,可以通過collMod命令結合索引收集標誌修改TTL索引。

6.衡量索引的使用

6.1 使用$indexStats獲取索引訪問信息
使用$indexStats聚合階段獲得關於集合中每個索引的使用情況的統計信息。例如,下面的聚合操作返回對orders集合使用的索引的統計信息:

db.orders.aggregate( [ { $indexStats: { } } ] )

6.2 使用explain()返回查詢計劃

使用executionStats模式下的db.collection.explain()或sor.explain()方法返回關於查詢過程的統計信息,包括使用的索引、掃描的文檔數量和查詢處理所需的時間(以毫秒爲單位)。

在allPlansExecution模式下運行db.collection.explain()或sor.explain()方法,以查看在計劃選擇期間收集的部分執行統計信息。

6.3 與hint()一起使用的控件索引
要強制MongoDB爲db.collection.find()操作使用特定的索引,請使用hint()方法指定索引。將hint()方法附加到find()方法中。考慮下面的例子:

db.people.find(
   { name: "John Doe", zipcode: { $gt: "63000" } }
).hint( { zipcode: 1 } )

要查看特定索引的執行統計信息,可以在db.collection.find()後面附加一個hint()方法和一個指針.explain(),例如:

db.people.find(
   { name: "John Doe", zipcode: { $gt: "63000" } }
).hint( { zipcode: 1 } ).explain("executionStats")

或者,將hint()方法附加到db.collection.explain().find():

db.people.explain("executionStats").find(
   { name: "John Doe", zipcode: { $gt: "63000" } }
).hint( { zipcode: 1 } )

爲hint()方法指定$natural操作符,以防止MongoDB使用任何索引:

db.people.find(
   { name: "John Doe", zipcode: { $gt: "63000" } }
).hint( { $natural: 1 } )

6.4指數指標
除了$indexStats聚合階段之外,MongoDB還提供了各種索引統計信息,您可以在分析數據庫的索引使用情況時考慮這些統計信息:

In the output of serverStatus:

metrics.queryExecutor.scanned

metrics.operation.scanAndOrder

In the output of collStats:

totalIndexSize

indexSizes

In the output of dbStats:

dbStats.indexes

dbStats.indexSize

7. 索引策略

應用程序的最佳索引必須考慮許多因素,包括預期的查詢類型、讀寫比率和系統上的空閒內存數量。

在開發索引策略時,您應該深入瞭解應用程序的查詢。在構建索引之前,應映射將要運行的查詢類型,以便能夠構建引用這些字段的索引。索引會帶來性能代價,但是對於大數據集的頻繁查詢來說,這種代價是值得的。考慮應用程序中每個查詢的相對頻率,以及該查詢是否適合索引。

設計索引的最佳總體策略是使用與您將在生產環境中運行的數據集類似的數據集來分析各種索引配置,以查看哪些配置執行得最好。檢查爲集合創建的當前索引,以確保它們支持當前和計劃的查詢。如果不再使用索引,則刪除該索引。

通常,MongoDB只使用一個索引來滿足大多數查詢。但是,$或查詢的每個子句可以使用不同的索引,此外,MongoDB還可以使用多個索引的交集。
以下文件介紹了索引策略:

創建索引來支持您的查詢
當索引包含由查詢掃描的所有字段時,索引支持查詢。創建支持查詢的索引將極大地提高查詢性能。
使用索引對查詢結果進行排序
爲了支持有效的查詢,在指定索引字段的順序和排序順序時,請使用這裏的策略。

確保索引適合RAM
當索引適合RAM時,系統可以避免從磁盤讀取索引,從而獲得最快的處理速度。
創建確保選擇性的查詢
選擇性是查詢使用索引縮小結果的能力。選擇性允許MongoDB將索引用於與完成查詢相關的大部分工作。

8. 創建索引來支持您的查詢

當索引包含由查詢掃描的所有字段時,索引支持查詢。查詢掃描索引,而不是集合。創建支持查詢的索引將極大地提高查詢性能。
本文檔描述了創建支持查詢的索引的策略。

8.1 如果所有查詢都使用相同的單鍵,則創建單鍵索引
如果只查詢給定集合中的一個鍵,那麼只需要爲該集合創建一個單鍵索引。例如,您可以在產品集合中創建一個category索引:

db.products.createIndex( { "category": 1 } )

8.2 創建複合索引來支持幾個不同的查詢
如果您有時只查詢一個鍵,而其他時候查詢該鍵和第二個鍵的組合,那麼創建複合索引要比創建單鍵索引更有效。MongoDB將爲這兩個查詢使用複合索引。例如,您可以在category和item上創建一個索引。

db.products.createIndex( { "category": 1, "item": 1 } )

這兩個選項都可以使用。您可以只查詢類別,也可以查詢類別與項目的組合。多個字段上的單個複合索引可以支持搜索這些字段的“前綴”子集的所有查詢。

EXAMPLE

The following index on a collection:

{ x: 1, y: 1, z: 1 }

Can support queries that the following indexes support:

{ x: 1 }
{ x: 1, y: 1 }

在某些情況下,前綴索引可以提供更好的查詢性能:例如,如果z是一個大數組。
{x: 1, y: 1, z: 1}索引還可以支持許多與以下索引相同的查詢:

{ x: 1, z: 1 }

此外,{x: 1, z: 1}還有一個額外的用途。給出以下查詢:

db.collection.find( { x: 5 } ).sort( { z: 1} )

{x: 1, z: 1}索引支持查詢和排序操作,而{x: 1, y: 1, z: 1}索引只支持查詢。有關排序的更多信息,請參見使用索引對查詢結果排序。

從2.6版開始,MongoDB可以使用index intersection來實現查詢。創建支持查詢的複合索引還是依賴於索引交集,這取決於系統的具體情況。有關詳細信息,請參閱索引交集和複合索引。

索引的使用和排序
若要爲字符串比較使用索引,操作還必須指定相同的排序規則。也就是說,如果具有排序規則的索引指定了不同的排序規則,則不支持對索引字段執行字符串比較的操作。
例如,集合myColl在排序區域設置爲“fr”的字符串字段類別上有一個索引。

索引的使用和排序
若要爲字符串比較使用索引,操作還必須指定相同的排序規則。也就是說,如果具有排序規則的索引指定了不同的排序規則,則不支持對索引字段執行字符串比較的操作。
例如,集合myColl在排序區域設置爲“fr”的字符串字段類別上有一個索引。

db.myColl.createIndex( { category: 1 }, { collation: { locale: "fr" } } )

下面的查詢操作指定了與索引相同的排序規則,可以使用索引:

db.myColl.find( { category: "cafe" } ).collation( { locale: "fr" } )

但是,下面的查詢操作,在默認情況下使用“簡單”的二進制排序器,不能使用索引:

db.myColl.find( { category: "cafe" } )

對於索引前綴鍵不是字符串、數組和嵌入文檔的複合索引,指定不同排序規則的操作仍然可以使用索引來支持對索引前綴鍵的比較。
例如,集合myColl在數值字段score和price以及字符串字段類別上有一個複合索引;索引是用排序區域設置“fr”創建的,用於字符串比較:

db.myColl.createIndex(
   { score: 1, price: 1, category: 1 },
   { collation: { locale: "fr" } } )

以下操作使用“簡單”的二進制排序規則進行字符串比較,可以使用索引:

db.myColl.find( { score: 5 } ).sort( { price: 1 } )
db.myColl.find( { score: 5, price: { $gt: NumberDecimal( "10" ) } } ).sort( { price: 1 } )

下面的操作使用“簡單”的二進制排序規則對索引的類別字段進行字符串比較,可以使用該索引僅滿足分數:查詢的5部分:

db.myColl.find( { score: 5, category: "cafe" } )

9. 使用索引對查詢結果進行排序

在MongoDB中,排序操作可以通過根據索引中的順序檢索文檔來獲得排序順序。如果查詢計劃器無法從索引中獲得排序順序,它將在內存中對結果進行排序。使用索引的排序操作通常比不使用索引的排序操作具有更好的性能。此外,不使用索引的排序操作在使用32 mb內存時將終止。

請注意:
由於在MongoDB 3.6中對數組字段的排序行爲的改變,當對一個用多鍵索引索引的數組進行排序時,查詢計劃包括一個阻塞排序階段。新的排序行爲可能會對性能產生負面影響。
在阻塞排序中,排序步驟必須消耗所有輸入,然後才能產生輸出。在非阻塞或索引排序中,排序步驟掃描索引以按請求的順序產生結果。

9.1 使用單個字段索引進行排序
如果升序或降序索引位於單個字段上,則該字段上的排序操作可以是雙向的。
例如,爲一個集合記錄在字段a上創建一個升序索引:

db.records.createIndex( { a: 1 } )

這個索引可以支持a上的升序排序:

db.records.find().sort( { a: 1 } )

該索引還可以支持以下降序排序對a通過遍歷索引的逆序:

db.records.find().sort( { a: -1 } )

9.2 對多個字段進行排序
創建一個複合索引來支持對多個字段進行排序。
您可以在索引的所有鍵上或在一個子集上指定排序;但是,排序鍵必須按照它們在索引中出現的順序列出。例如,索引鍵模式{a: 1, b: 1}可以支持{a: 1, b: 1}上的排序,但不支持{b: 1, a: 1}上的排序。

對於要爲排序使用複合索引的查詢,在cursor.sort()文檔中爲所有鍵指定的排序方向必須與索引鍵模式匹配或與索引鍵模式相反。例如,索引鍵模式{a: 1, b: -1}可以支持對{a: 1, b: -1}和{a: -1, b: 1}進行排序,但不支持對{a: -1, b: -1}或{a: 1, b: 1}進行排序。

9.2.1 排序和索引前綴
如果排序鍵對應於索引鍵或索引前綴,MongoDB可以使用索引對查詢結果進行排序。複合索引的前綴是在索引鍵模式開始處由一個或多個鍵組成的子集。
例如,在數據收集上創建一個複合索引:

db.data.createIndex( { a:1, b: 1, c: 1, d: 1 } )

然後,以下是該索引的前綴:

{ a: 1 }
{ a: 1, b: 1 }
{ a: 1, b: 1, c: 1 }

下面的查詢和排序操作使用索引前綴對結果進行排序。這些操作不需要對內存中的結果集進行排序。

Example Index Prefix
db.data.find().sort( { a: 1 } ) { a: 1 }
db.data.find().sort( { a: -1 } ) { a: 1 }
db.data.find().sort( { a: 1, b: 1 } ) { a: 1, b: 1 }
db.data.find().sort( { a: -1, b: -1 } ) { a: 1, b: 1 }
db.data.find().sort( { a: 1, b: 1, c: 1 } ) { a: 1, b: 1, c: 1 }
db.data.find( { a: { $gt: 4 } } ).sort( { a: 1, b: 1 } ) { a: 1, b: 1 }

考慮下面的例子,其中索引的前綴鍵同時出現在查詢謂詞和排序中:

db.data.find( { a: { $gt: 4 } } ).sort( { a: 1, b: 1 } )

在這種情況下,MongoDB可以使用索引按照sort指定的順序檢索文檔。如示例所示,查詢謂詞中的索引前綴可以與排序中的前綴不同。

9.2.2 索引的排序和非前綴子集
索引可以支持對索引鍵模式的非前綴子集進行排序操作。爲此,查詢必須包括排序鍵之前的所有前綴鍵上的相等條件。
例如,收集的數據有以下索引:

{ a: 1, b: 1, c: 1, d: 1 }

以下操作可以使用索引來獲得排序順序:

Example Index Prefix
db.data.find( { a: 5 } ).sort( { b: 1, c: 1 } ) { a: 1 , b: 1, c: 1 }
db.data.find( { b: 3, a: 4 } ).sort( { c: 1 } ) { a: 1, b: 1, c: 1 }
db.data.find( { a: 5, b: { $lt: 3} } ).sort( { b: 1 } ) { a: 1, b: 1 }

如最後一個操作所示,只有排序子集之前的索引字段在查詢文檔中必須具有相等條件;其他索引字段可以指定其他條件。
如果查詢沒有在排序規範之前或與排序規範重疊的索引前綴上指定相等條件,則操作將不能有效地使用索引。例如,以下操作指定了一個{c: 1}的排序文檔,但是查詢文檔不包含對前面索引字段a和b的相等匹配:

db.data.find( { a: { $gt: 2 } } ).sort( { c: 1 } )
db.data.find( { c: 5 } ).sort( { c: 1 } )

這些操作不會有效地使用索引{a: 1, b: 1, c: 1, d: 1},甚至可能不會使用索引來檢索文檔。

9.3 索引的使用和排序
若要爲字符串比較使用索引,操作還必須指定相同的排序規則。也就是說,如果具有排序規則的索引指定了不同的排序規則,則不支持對索引字段執行字符串比較的操作。
例如,集合myColl在排序區域設置爲“fr”的字符串字段類別上有一個索引。

db.myColl.createIndex( { category: 1 }, { collation: { locale: "fr" } } )

下面的查詢操作指定了與索引相同的排序規則,可以使用索引:

db.myColl.find( { category: "cafe" } ).collation( { locale: "fr" } )

但是,下面的查詢操作,在默認情況下使用“簡單”的二進制排序器,不能使用索引:

db.myColl.find( { category: "cafe" } )

對於索引前綴鍵不是字符串、數組和嵌入文檔的複合索引,指定不同排序規則的操作仍然可以使用索引來支持對索引前綴鍵的比較。
例如,集合myColl在數值字段score和price以及字符串字段類別上有一個複合索引;索引是用排序區域設置“fr”創建的,用於字符串比較:

db.myColl.createIndex(
   { score: 1, price: 1, category: 1 },
   { collation: { locale: "fr" } } )

以下操作使用“簡單”的二進制排序規則進行字符串比較,可以使用索引:

db.myColl.find( { score: 5 } ).sort( { price: 1 } )
db.myColl.find( { score: 5, price: { $gt: NumberDecimal( "10" ) } } ).sort( { price: 1 } )

下面的操作使用“簡單”的二進制排序規則對索引的類別字段進行字符串比較,可以使用該索引僅滿足分數:查詢的5部分:

db.myColl.find( { score: 5, category: "cafe" } )

10. 確保索引適合RAM

爲了獲得最快的處理速度,請確保索引完全適合RAM,以便系統可以避免從磁盤讀取索引。
要檢查索引的大小,可以使用db.collection.totalIndexSize()幫助器,它以字節爲單位返回數據:

> db.collection.totalIndexSize()
4294976499

上面的示例顯示索引大小接近4.3 gb。爲了確保這個索引適合RAM,您不僅必須有超過那個可用RAM,而且還必須有RAM可用於其餘的工作集。還請記住:

如果您擁有並使用多個集合,則必須考慮所有集合上的所有索引的大小。索引和工作集必須能夠同時裝入內存。
在某些有限的情況下,索引不需要裝入內存。查看僅在RAM中保存最近值的索引。

10.1 僅在RAM中保存最近值的索引
在所有情況下,索引不必完全適合RAM。如果索引字段的值隨着每次插入而增加,並且大多數查詢選擇最近添加的文檔;然後MongoDB只需要在RAM中保留保存最近或“最右邊”值的部分索引。這允許高效地使用索引進行讀寫操作,並最小化支持索引所需的RAM數量。

11. 創建確保選擇性的查詢

選擇性是查詢使用索引縮小結果的能力。有效的索引更具選擇性,並且允許MongoDB將索引用於與完成查詢相關的大部分工作。
爲了確保選擇性,可以編寫查詢來限制帶索引字段的可能文檔的數量。編寫相對於索引數據具有適當選擇性的查詢。

例子:
假設您有一個名爲status的字段,其中可能的值是新的並經過處理的。如果您在狀態上添加了一個索引,那麼您就創建了一個低選擇性索引。索引對查找記錄幾乎沒有幫助。
根據您的查詢,更好的策略是創建一個包含低選擇性字段和另一個字段的複合索引。例如,您可以在status和created_at上創建複合索引。
另一種選擇(同樣取決於您的用例)可能是使用單獨的集合,每個集合對應一個狀態。

例子
考慮一個集合上的索引{a: 1}(即按升序排序的鍵a上的索引),其中a有三個值均勻地分佈在集合上:

{ _id: ObjectId(), a: 1, b: "ab" }
{ _id: ObjectId(), a: 1, b: "cd" }
{ _id: ObjectId(), a: 1, b: "ef" }
{ _id: ObjectId(), a: 2, b: "jk" }
{ _id: ObjectId(), a: 2, b: "lm" }
{ _id: ObjectId(), a: 2, b: "no" }
{ _id: ObjectId(), a: 3, b: "pq" }
{ _id: ObjectId(), a: 3, b: "rs" }
{ _id: ObjectId(), a: 3, b: "tv" }

如果查詢{a: 2, b: "no"} MongoDB必須掃描集合中的3個文檔才能返回一個匹配的結果。類似地,對於{a: {$gt: 1}, b:“tv”}的查詢必須掃描6個文檔,也才能返回一個結果。
考慮一個集合上的相同索引,其中a有9個值均勻地分佈在集合上:

{ _id: ObjectId(), a: 1, b: "ab" }
{ _id: ObjectId(), a: 2, b: "cd" }
{ _id: ObjectId(), a: 3, b: "ef" }
{ _id: ObjectId(), a: 4, b: "jk" }
{ _id: ObjectId(), a: 5, b: "lm" }
{ _id: ObjectId(), a: 6, b: "no" }
{ _id: ObjectId(), a: 7, b: "pq" }
{ _id: ObjectId(), a: 8, b: "rs" }
{ _id: ObjectId(), a: 9, b: "tv" }

如果查詢{a: 2, b: "cd"}, MongoDB必須只掃描一個文檔來完成查詢。索引和查詢的選擇性更強,因爲a的值是均勻分佈的,查詢可以使用索引選擇特定的文檔。
但是,雖然a上的索引更有選擇性,但是像{a: {$gt: 5}、b:“tv”}這樣的查詢仍然需要掃描4個文檔。

如果總體選擇性較低,而且MongoDB必須讀取大量文檔才能返回結果,那麼有些查詢在沒有索引的情況下執行起來可能更快。要確定性能,請參見使用度量指標。

11.索引參考

mongo Shell中的索引方法

Name Description
db.collection.createIndex() 在集合上建立索引。
db.collection.dropIndex() 刪除集合上的指定索引。
db.collection.dropIndexes() 刪除集合上的所有索引。
db.collection.getIndexes() 返回描述集合上現有索引的文檔數組。
db.collection.reIndex() 重新構建集合上的所有現有索引。
db.collection.totalIndexSize() 報告集合上索引使用的總大小。爲collStats輸出的totalIndexSize字段提供一個包裝器。
cursor.explain() 報告遊標的查詢執行計劃。
cursor.hint() 強制MongoDB爲查詢使用特定的索引。
cursor.max() 爲遊標指定獨佔的上界索引。使用cursor.hint()
cursor.min() 爲遊標指定包含的下標界限. For use with cursor.hint()

索引數據庫命令

Name Description
createIndexes 爲集合構建一個或多個索引。
dropIndexes 從集合中移除索引。
compact 對集合進行碎片整理並重新構建索引。
reIndex 重新構建集合上的所有索引。
validate 內部命令,用於掃描集合的數據和索引以確保正確性。
geoSearch 執行使用MongoDB的haystack索引功能的地理空間查詢。
checkShardingIndex 在分片鍵上驗證索引的內部命令。

地理空間查詢選擇器

Name Description
$geoWithin 選擇包圍GeoJSON幾何圖形中的幾何圖形。2dsphere和2dindexes支持$geoWithin。
$geoIntersects 選擇與GeoJSON幾何圖形相交的幾何圖形。2dsphere索引支持$geoIntersects。
$near 返回一個點附近的地理空間對象。需要地理空間索引。2dsphere和2d索引支持$near。
$nearSphere 返回接近球體上某一點的地理空間對象。需要地理空間索引。2dsphere和2d索引支持$nearSphere。

索引查詢修飾符

Name Description
$explain 強制MongoDB報告查詢執行計劃。見 explain().
$hint 強制MongoDB使用特定的索引。See hint()
$max 指定要在查詢中使用的索引的獨佔上限。 See max().
$min 指定要在查詢中使用的索引的包含下限。See min().
$returnKey 強制光標只返回索引中包含的字段。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章