MongoDB 索引

索引在任何資料庫中都非常重要,而 MongoDB 沒有什麼不同。通過使用索引,在 MongoDB 中執行查詢變得更有效率。

如果你有一個包含數千個沒有索引的文件的集合,然後你查詢以查詢某些文件,那麼在這種情況下,MongoDB 需要掃描整個集合以查詢文件。但是如果你有索引,MongoDB 會使用這些索引來限制必須在集合中搜尋的文件數量。

索引是儲存集合資料的部分部分的特殊資料集。由於資料是部分資料,因此更容易讀取此資料。此部分集儲存特定欄位的值或按欄位值排序的一組欄位。

在本教程中,你將學習 -

  • 瞭解指數的影響

  • 建立索引

  • 尋找指數

  • 刪除索引

瞭解索引的影響

現在,即使從介紹中我們已經看到索引對查詢有好處,但索引太多會降低其他操作的速度,例如插入,刪除和更新操作。

如果對文件執行頻繁的插入,刪除和更新操作,則索引需要經常更改,這只是集合的開銷。

下面的示例顯示了哪些欄位值可以構成集合中的索引的示例。索引可以僅基於集合中的一個欄位,也可以基於集合中的多個欄位。

在下面的示例中,Employeeid 1 和 EmployeeCode AA 用於索引集合中的文件。因此,在進行查詢搜尋時,這些索引將用於快速有效地在集合中查詢所需的文件。

因此,即使搜尋查詢基於 EmployeeCode AA,也將返回該文件。

{
    Employeeid	:  1
    EmployeeCode : AA
    EmployeeName : "Joe"
    Awards		 : 1
    Country      : US
}

Mongodb createIndex() - 建立索引

使用 createIndex 方法在 MongoDB 中建立索引。

以下示例顯示瞭如何完成此操作。假設我們有相同的 Employee 集合,其欄位名稱為 EmployeeidEmployeeName

> db.Employee.createIndex({Employeeid:1})

程式碼說明:

  1. createIndex 方法用於根據文件的 Employeeid 建立索引。
  2. 1 參數列示當使用 Employeeid 欄位值建立索引時,它們應按升序排序。請注意,這與_id 欄位(id 欄位用於唯一標識集合中的每個文件)不同,後者由 MongoDB 在集合中自動建立。現在,文件將按 Employeeid 排序,而不是_id 欄位。

如果命令執行成功,將顯示以下輸出:

輸出:

> db. Employee.createIndex({Employeeid:1})
{
    "createdcollectionAutomatically": false, 
    "numIndexesBefore" : 1, 
    "numIndexesAfter" : 2,
    "ok" : 1
}
  1. numIndexesBefore: 1 表示在執行命令之前索引中存在的欄位值(集合中的實際欄位)的數量。請記住,每個集合都有_id 欄位,該欄位也計入索引的欄位值。由於_id 索引欄位是最初建立時集合的一部分,因此 numIndexesBefore 的值為 1。
  2. numIndexesAfter: 2 表示命令執行後索引中存在的欄位值的數量。
  3. 此處 ok: 1 輸出指定操作成功,並將新索引新增到集合中。

上面的程式碼顯示瞭如何基於一個欄位值建立索引,但是也可以基於多個欄位值建立索引。

以下示例說明了如何完成此操作;

> db. Employee.createIndex({Employeeid:1 , EmployeeName:1})

程式碼說明:

  1. createIndex 方法現在考慮多個 Field 值,這些值現在將導致基於 EmployeeidEmployeeName 建立索引。 Employeeid:1EmployeeName:1 表示應在這兩個欄位值上建立索引,其中 :1 表示它應按升序排列。

Mongodb getindexes() - 查詢索引

在 MongoDB 中查詢索引是通過使用 getIndexes 方法完成的。

以下示例說明了如何完成此操作;

> db.Employee.getIndexes()

程式碼說明:

  1. getIndexes 方法用於查詢集合中的所有索引。

如果命令執行成功,將顯示以下輸出:

輸出:

> db.Employee.getIndexes()
[
	{
		"v"	: 1,
        "Key" : {
        		"_id" : 1
        },
        "name" : "_id", 
        "ns" : "Employee.Employee"
    },
    {
        "v"	: 2,
        "key" : {
        		"Employeeid" : 1
        },
        "name" : "Employeeid_1", 
        "ns" : "Employee. Employee"
	}
]
  1. 輸出返回一個文件,該文件只顯示集合中有 2 個索引,即_id 欄位,另一個是 Employee id 欄位。 :1 表示索引中的欄位值按升序建立。

Mongodb dropindex() - 刪除索引

使用 dropIndex 方法刪除 MongoDB 中的索引。

以下示例說明了如何完成此操作;

> db.Employee.dropIndex({Employeeid:1})

程式碼說明:

  1. dropIndex 方法獲取需要從索引中刪除的必需欄位值。

如果命令執行成功,將顯示以下輸出:

輸出:

> db.Employee.dropIndex({Employeeid:1})
{ "nIndexesWas" : 3, "ok" : 1}
  1. nIndexesWas:3 表示在執行命令之前索引中存在的欄位值的數量。請記住,每個集合都有_id 欄位,該欄位也計入索引的欄位值。
  2. ok:1 輸出指定操作成功,並從索引中刪除 Employeeid 欄位。

要在集合中一次刪除所有索引,可以使用 dropIndexes 命令。

以下示例顯示瞭如何完成此操作。

> db.Employee.dropIndexes()

程式碼說明:

  1. dropIndexes 方法將刪除除_id 索引之外的所有索引。

如果命令執行成功,將顯示以下輸出:

輸出:

> db.Employee.dropIndexes()
{
    "nIndexesWas" : 2,
    "msg" : "non-_id indexes dropped for collection",
    "ok" ; 1
}
  1. nIndexesWas:2 表示在執行命令之前索引中存在的欄位值的數量。
  2. 再次記住,每個集合都有_id 欄位,該欄位也被視為索引的欄位值,MongoDB 不會將其刪除,這就是此訊息所指示的內容。
  3. ok:1 輸出指定操作成功。