在 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 中,如果删除了集合,索引也会自动删除吗?的主要内容,如果未能解决你的问题,请参考以下文章