db.collection.dropIndex()
带有驱动程序的MongoDB
本页介绍了以下内容:mongosh 方法。要查看特定编程语言的等效方法,请参阅相应页面
定义
db.collection.dropIndex(index)从集合中删除或移除指定的索引。
注意
您不能删除
_id字段上的默认索引。您不能指定
db.collection.dropIndex("*")来删除所有非_id索引。请使用db.collection.dropIndexes()代替。
要获取
db.collection.dropIndex()方法的索引名称或索引规范文档,请使用db.collection.getIndexes()方法。db.collection.dropIndex()方法接受以下参数参数类型描述index字符串或文档必需。指定要删除的索引。您可以通过索引名称或索引规范文档指定索引。
要删除一个 文本 索引,请指定索引名称。
您不能指定
"*"来删除所有非_id索引。请使用db.collection.dropIndexes()代替。如果指定的索引仍在构建中,
db.collection.dropIndex()将尝试停止正在进行的构建。停止索引构建的效果与删除已构建的索引相同。有关更完整的文档,请参阅停止正在进行的索引构建。
兼容性
此方法在以下环境中托管的部署中可用
MongoDB Atlas:云中 MongoDB 部署的完全托管服务
注意
此命令在所有 MongoDB Atlas 集群中都受支持。有关 Atlas 对所有命令的支持信息,请参阅不受支持的命令。
MongoDB Enterprise:基于订阅的自托管 MongoDB 版本
MongoDB Community:源代码可用、免费使用且可自托管的 MongoDB 版本
行为
从MongoDB 5.2版本开始,您可以使用 db.collection.dropIndex() 来删除同一集合上的现有索引,即使另一个索引的构建正在进行。在早期版本中,在索引构建过程中尝试删除不同的索引会导致 BackgroundOperationInProgressForNamespace 错误。
资源锁定
db.collection.dropIndex() 在操作期间会锁定指定的集合。所有后续对该集合的操作都必须等待 db.collection.dropIndex() 释放锁。
停止正在进行的索引构建
如果指定给 db.collection.dropIndex() 的索引仍在构建中,db.collection.dropIndex() 将尝试停止正在进行的构建。停止索引构建的效果与删除已构建的索引相同。
对于复制集,请在 主节点 上运行 db.collection.dropIndex()。主节点将停止索引构建并创建相关的 "abortIndexBuild" 操作日志 条目。复制节点将复制 "abortIndexBuild" 操作日志条目,停止正在进行的索引构建并丢弃构建任务。有关索引构建过程的详细文档,请参阅 索引构建过程。
使用 currentOp 来识别与 createIndexes 或 db.collection.createIndexes() 操作相关的索引构建。请参阅 活动索引操作 以获取示例。
隐藏索引
MongoDB 提供了隐藏或取消隐藏索引以供查询计划器使用的能力。通过从计划器中隐藏索引,您可以在实际删除索引之前评估删除索引的潜在影响。
如果在评估后用户决定删除索引,您可以删除隐藏的索引;即不需要先取消隐藏再删除。
然而,如果影响是负面的,用户可以选择取消隐藏索引而不是重新创建已删除的索引。由于索引在隐藏期间得到完全维护,取消隐藏后索引立即可用于使用。
有关隐藏索引的更多信息,请参阅 隐藏索引。
示例
考虑一个 pets 集合。在 pets 集合上调用 db.collection.getIndexes() 方法将返回以下索引
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "cat" : -1 }, "name" : "catIdx" }, { "v" : 2, "key" : { "cat" : 1, "dog" : -1 }, "name" : "cat_1_dog_-1" } ]
在字段 cat 上的单一字段索引具有用户指定的名称 catIdx [1] 以及索引规范文档 { "cat" : -1 }。
要删除索引 catIdx,您可以使用索引名称
db.pets.dropIndex( "catIdx" )
或者您可以使用索引规范文档 { "cat" : -1 }
db.pets.dropIndex( { "cat" : -1 } )
| [1] | 在索引创建过程中,如果用户没有指定索引名称,系统将根据索引键字段和值使用下划线生成名称,例如 cat_1。 |