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 输出指定操作成功。