在MongoDB中,使用remove或dropDatabase来清空数据库?还是两者都要用?

5 浏览
0 Comments

在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不再占用数十亿字节的空间。然而,我想了解发生了什么。

命令removedropDatabase之间有什么区别?何时使用其中一个,何时使用另一个?(我正在同时运行两个 - 这只是愚蠢吗?)此外,是否有人知道在运行remove之后为什么Mongo仍然占用大量空间?

欢迎提供相关阅读链接。(但最好是针对“ Dummies”级别的读物。说我是Mongo新手,这是对实际的Mongo新手的侮辱。)

admin 更改状态以发布 2023年5月24日
0
0 Comments

我会用简单的话解释,并尝试简短:

Collection.remove(query)

如果你想根据查询条件 ({}) 从集合中删除任何东西,请记住这个?这在你的代码中。这实际上被称为查询,当前查询对象中的空对象 {} 意味着它应该与所有对象匹配。现在为什么它不释放所有空间,因为它为读写操作分配内存并将其保留以备将来使用。因此,你的数据始终会比 MongoDB 在物理内存上获取的空间小。

它仅从 1 个集合中删除数据。在你的情况下,你只有一个集合。为了更深入地了解它是如何工作的,你可以查看这个链接

Db.dropDatabase()

它从数据库中删除所有内容,你的索引信息,你的基于集合的配置,不在内存中的任何东西,因为没有配置或任何集合。你的空间可以自由使用。

它从所有集合中删除所有数据和所有集合的元数据。实际上,它会删除数据库本身。在你的情况下,你可以依靠 db.dropDatabase() 进行将来的使用。

查看其产生的效果 here

0
0 Comments

主要的区别在于,db.remove({})删除了所有文档,但您的集合仍然具有索引等元数据。 dropDatabase可以完全删除集合,包括元数据。\n如果您要重建集合索引或者没有它,请使用dropDatabase,它速度更快。\n请访问此链接,了解db.collection.drop()db.dropDatabase()之间的差异。\n如果您对学习MongoDb感兴趣,我建议阅读此书籍。它还解释了您的用例。

0