【发布时间】:2012-01-20 08:06:07
【问题描述】:
如果我在 Mongo 中创建一个集合,并且在将文档添加到该集合后,我使用 ensureIndex() 在该集合中的文档上的一个数字字段上创建一个索引,如果我删除该集合,我是否有重新创建索引?
【问题讨论】:
标签: mongodb collections indexing document
如果我在 Mongo 中创建一个集合,并且在将文档添加到该集合后,我使用 ensureIndex() 在该集合中的文档上的一个数字字段上创建一个索引,如果我删除该集合,我是否有重新创建索引?
【问题讨论】:
标签: mongodb collections indexing document
简短回答:是的。
索引在收集删除时下降。您需要重新创建一个索引。
您可能不想删除集合,而是使用db.collection_name.remove({}) 删除其中的所有项目。这将需要更多资源,但会留下您的索引。实际上它需要删除所有索引数据。这就是为什么最好删除整个集合并在此之后重新创建索引的原因。
【讨论】:
remove() 在大型收藏中可能需要很长时间。 drop() 快得多,但有删除所有索引的缺点,如前所述。
我只是在具有 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}在后台创建你的索引,所以当你运行你的测试或其他东西时你的索引可能还没有重新创建
正如您所怀疑的那样,删除集合确实会删除所有索引,因此当您重新创建集合时(显式地或通过添加新文档隐式地),您将需要重新创建您需要存在的任何索引。 _id 上的默认索引是自动为您创建的。
【讨论】: