在 MongoDB 中,如果删除了集合,索引也会自动删除吗?

Posted

技术标签:

【中文标题】在 MongoDB 中,如果删除了集合,索引也会自动删除吗?【英文标题】:In MongoDB, if collection is dropped, indexes dropped automatically as well? 【发布时间】:2012-01-20 08:06:07 【问题描述】:

如果我在 Mongo 中创建一个集合,并且在将文档添加到该集合后,我使用 ensureIndex() 在该集合中的文档上的一个数字字段上创建一个索引,如果我删除该集合,我是否有重新创建索引?

【问题讨论】:

【参考方案1】:

简短回答:是的。

索引在收集删除时下降。您需要重新创建一个索引。

您可能不想删除集合,而是使用db.collection_name.remove() 删除其中的所有项目。这将需要更多资源,但会留下您的索引。实际上它需要删除所有索引数据。这就是为什么最好删除整个集合并在此之后重新创建索引的原因。

【讨论】:

我可以在空集合上创建索引吗? 是的,你可以。该集合将在您创建索引时创建。 remove() 在大型收藏中可能需要很长时间。 drop() 快得多,但有删除所有索引的缺点,如前所述。【参考方案2】:

我只是在具有 10 个索引的集合上执行此操作,并且不想手动重新创建这些索引。您可以在 mongo shell 中使用以下三行使用索引完成删除和重新创建:

var indexes = db.collection.getIndexKeys().splice(1)
db.collection.drop();
indexes.forEach(function(el) db.collection.ensureIndex(el, background:true); )

这不足以处理唯一或稀疏索引,但我认为通过使用 getIndexes() 的输出来支持它会相当容易。我不需要那个,所以我没有这样做。

splice(1) 只是删除 _id 上的索引,因为它会自动创建。

【讨论】:

非常感谢,但是background:true 删除了我的索引,没有它就很好用 那是因为background:true在后台创建你的索引,所以当你运行你的测试或其他东西时你的索引可能还没有重新创建【参考方案3】:

正如您所怀疑的那样,删除集合确实会删除所有索引,因此当您重新创建集合时(显式地或通过添加新文档隐式地),您将需要重新创建您需要存在的任何索引。 _id 上的默认索引是自动为您创建的。

【讨论】:

好的,明白了,如果索引已经存在,在同一个集合上多次调用 ensureIndex() 有什么坏处吗? 无害。检查您尝试确保的索引是否已经存在的性能影响较小。

以上是关于在 MongoDB 中,如果删除了集合,索引也会自动删除吗?的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB TTL 索引不会删除过期文档

如何在 MongoDB 中删除或删除集合?

MongoDB 索引限制

MongoDB索引限制

索引及集合管理 - MongoDB从入门到删库

Mongodb 特殊索引和集合