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 集合,其字段名称为 Employeeid
和 EmployeeName
。
> db.Employee.createIndex({Employeeid:1})
代码说明:
createIndex
方法用于根据文档的Employeeid
创建索引。1
参数表示当使用Employeeid
字段值创建索引时,它们应按升序排序。请注意,这与_id 字段(id 字段用于唯一标识集合中的每个文档)不同,后者由 MongoDB 在集合中自动创建。现在,文档将按Employeeid
排序,而不是_id 字段。
如果命令执行成功,将显示以下输出:
输出:
> db. Employee.createIndex({Employeeid:1})
{
"createdcollectionAutomatically": false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
numIndexesBefore: 1
表示在运行命令之前索引中存在的字段值(集合中的实际字段)的数量。请记住,每个集合都有_id 字段,该字段也计入索引的字段值。由于_id 索引字段是最初创建时集合的一部分,因此numIndexesBefore
的值为 1。numIndexesAfter: 2
表示命令运行后索引中存在的字段值的数量。- 此处
ok: 1
输出指定操作成功,并将新索引添加到集合中。
上面的代码显示了如何基于一个字段值创建索引,但是也可以基于多个字段值创建索引。
以下示例说明了如何完成此操作;
> db. Employee.createIndex({Employeeid:1 , EmployeeName:1})
代码说明:
createIndex
方法现在考虑多个 Field 值,这些值现在将导致基于Employeeid
和EmployeeName
创建索引。Employeeid:1
和EmployeeName:1
表示应在这两个字段值上创建索引,其中:1
表示它应按升序排列。
Mongodb getindexes()
- 查找索引
在 MongoDB 中查找索引是通过使用 getIndexes
方法完成的。
以下示例说明了如何完成此操作;
> db.Employee.getIndexes()
代码说明:
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"
}
]
- 输出返回一个文档,该文档只显示集合中有 2 个索引,即_id 字段,另一个是 Employee id 字段。 :1 表示索引中的字段值按升序创建。
Mongodb dropindex()
- 删除索引
使用 dropIndex
方法删除 MongoDB 中的索引。
以下示例说明了如何完成此操作;
> db.Employee.dropIndex({Employeeid:1})
代码说明:
dropIndex
方法获取需要从索引中删除的必需字段值。
如果命令执行成功,将显示以下输出:
输出:
> db.Employee.dropIndex({Employeeid:1})
{ "nIndexesWas" : 3, "ok" : 1}
nIndexesWas:3
表示在运行命令之前索引中存在的字段值的数量。请记住,每个集合都有_id 字段,该字段也计入索引的字段值。ok:1
输出指定操作成功,并从索引中删除Employeeid
字段。
要在集合中一次删除所有索引,可以使用 dropIndexes
命令。
以下示例显示了如何完成此操作。
> db.Employee.dropIndexes()
代码说明:
dropIndexes
方法将删除除_id 索引之外的所有索引。
如果命令执行成功,将显示以下输出:
输出:
> db.Employee.dropIndexes()
{
"nIndexesWas" : 2,
"msg" : "non-_id indexes dropped for collection",
"ok" ; 1
}
nIndexesWas:2
表示在运行命令之前索引中存在的字段值的数量。- 再次记住,每个集合都有_id 字段,该字段也被视为索引的字段值,MongoDB 不会将其删除,这就是此消息所指示的内容。
ok:1
输出指定操作成功。