MongoDB:删除集合与删除所有文档的权衡。

26

删除MongoDB集合和删除其中所有文档有什么权衡之处(假定该集合将立即被重新创建)?

4个回答

30
仅删除集合的好处在于比删除集合中所有文档要快得多。如果您的集合将立即“重新创建”(假设包括索引重新创建),那么这可能是最有吸引力的选项。
该书的作者MongoDB:权威指南(Kristina Chodorow和Michael Dirolf)进行了一项实验,提供了一个Python脚本,计时dropremove的1000000个记录。结果显示drop为0.01秒,remove为46.08秒。尽管确切时间可能因硬件和其他因素而异,但它仍然说明了drop显着更快。
参考: Chodorow K.,Dirolf M.(2010)。 “MongoDB:权威指南。” O'Reilly Media,Inc. Sebastapol,CA.,第25页

7
对于答案的加一,但是关于删除与移除有一个注意点,那就是在分片环境中,随着各个版本出现了几个相关的重用已删除集合名称(甚至特定情况下的前缀)的错误。我所知道的最新相关错误是这个:https://jira.mongodb.org/browse/SERVER-4262,并且它已在2.2中得到修复 - 如果您计划进行大量的删除/重新创建操作,这是需要注意的事项。 - Adam Comerford
感谢您的提示,@AdamC!我想在分片/复制混合的情况下,这种情况确实有点棘手。我在家里的实验室中有一个主/从复制配置,我将尝试在上面进行测试。 - Aaron

26

如果您遍历一个集合并移除其中所有文档,那么您需要做更多的工作(释放文档的存储空间、清理指向文档的索引条目等)。相反,如果您只是删除整个集合,它将仅回收集合和其索引使用的区域。

另一个区别是删除集合还会删除该集合的索引。


2
删除和删除集合主要是实现细节。
删除集合需要以一对一的方式更新现有于集合中的内部状态。
删除集合需要在数据库或数据文件中释放一些大型数据结构。
删除集合比逐个删除直到集合为空要快得多。
如果删除集合,则元数据(如索引)将仍然存在,而不是在删除集合时才存在。
来源:MongoDB大学课程

0

一旦我们在集合中存储了文档,我们可以通过两种方式将所有文档从中删除。现在选择其中一种完全取决于您的要求。

1. 使用drop(): 通过在集合上调用drop(),它将从中删除所有文档,删除所有索引,并最终删除集合本身。

2.使用remove(): remove有两个重载版本,一个是我们将传递标准来删除与我们传递的标准匹配的所有文档,第二个是默认值,在此之前我们不会传递任何标准(2.6版之前)或传递一个空文档(2.6版或更高版本),它将从集合中删除所有文档。在这里,当我们的意图是清除集合中的所有文档时,我们更感兴趣的是第二个版本。

备注:如果要从集合中删除所有文档,使用drop()方法删除整个集合(包括索引),然后重新创建集合并重建索引可能更有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接