在MongoDB中,使用remove或dropDatabase来清空数据库?还是两者都要用?
在MongoDB中,使用remove或dropDatabase来清空数据库?还是两者都要用?
我有一个连接到Raspi的传感器,使用Mongo进行数据收集。每隔几天,我使用mongodump
复制数据库,然后删除Mongo文件并重新启动传感器。
我在删除/清空Mongo方面遇到了一些问题,希望了解我做错了什么。
最初,我使用以下命令:
use [database] db.[nameOfOnlyCollection].remove({})
清空数据库(它只有一个集合)。使用命令db.[nameOfOnlyCollection].count()
,我可以验证该集合为空。
然而,即使在此之后,Mongo仍在Raspi上占用了大量空间。更具体地说,这些(看似与Mongo相关的)示例占用了数十亿字节的空间:
- /var/lib/mongodb
- /var/lib/mongodb/journal
- /var/log/mongodb
然后,我发现一个答案推荐使用命令db.dropDatabase()
删除数据库中的所有条目。
现在我同时运行db.[nameOfCollection].remove({})
和db.dropDatabase()
,并解决了这个问题。也就是说,Mongo不再占用数十亿字节的空间。然而,我想了解发生了什么。
命令remove
和dropDatabase
之间有什么区别?何时使用其中一个,何时使用另一个?(我正在同时运行两个 - 这只是愚蠢吗?)此外,是否有人知道在运行remove
之后为什么Mongo仍然占用大量空间?
欢迎提供相关阅读链接。(但最好是针对“ Dummies”级别的读物。说我是Mongo新手,这是对实际的Mongo新手的侮辱。)
我会用简单的话解释,并尝试简短:
Collection.remove(query)
如果你想根据查询条件 ({})
从集合中删除任何东西,请记住这个?这在你的代码中。这实际上被称为查询,当前查询对象中的空对象 {}
意味着它应该与所有对象匹配。现在为什么它不释放所有空间,因为它为读写操作分配内存并将其保留以备将来使用。因此,你的数据始终会比 MongoDB 在物理内存上获取的空间小。
它仅从 1 个集合中删除数据。在你的情况下,你只有一个集合。为了更深入地了解它是如何工作的,你可以查看这个链接
Db.dropDatabase()
它从数据库中删除所有内容,你的索引信息,你的基于集合的配置,不在内存中的任何东西,因为没有配置或任何集合。你的空间可以自由使用。
它从所有集合中删除所有数据和所有集合的元数据。实际上,它会删除数据库本身。在你的情况下,你可以依靠 db.dropDatabase()
进行将来的使用。
查看其产生的效果 here