在Mongodb中:使用remove或dropDatabase清空数据库?或两者?

时间:2018-04-10 11:05:02

标签: mongodb

我有一个传感器连接到Raspi,使用Mongo收集数据。我每隔几天复制数据库(使用mongodump),然后删除Mongo文件并重新启动传感器。

我在删除/使用Mongo时遇到了一些麻烦,并想了解我做错了什么。

最初,我使用了命令:

use [database]
db.[nameOfOnlyCollection].remove({})

清空数据库(它只有一个集合)。使用命令db.[nameOfOnlyCollection].count()我可以验证集合是否为空。

然而,即使在此之后,Mongo仍然在Raspi上占用了大量空间。更具体地说,这些(看似与Mongo相关)的例子占据了几个空间:

  • 的/ var / lib中/ mongodb的
  • 的/ var / lib中/ mongodb的/轴颈
  • 的/ var /日志/ mongodb的

然后我发现an answer建议命令db.dropDatabase()删除数据库中的所有条目。

我现在同时运行db.[nameOfCollection].remove({})db.dropDatabase(),这解决了问题。意思是,Mongo不再需要太多的演出。但是,我想了解发生了什么。

命令removedropDatabase之间有什么区别?什么时候应该使用一个,当另一个? (我正在同时运行 - 这真是太傻了吗?)另外,有没有人知道为什么即使在运行remove之后Mongo仍然占用了大量空间?

任何相关阅读的链接都将受到赞赏。 (但最好是关于“傻瓜”级别的读数。说我是一个Mongo noob会对实际的Mongo新手侮辱。)

2 个答案:

答案 0 :(得分:2)

主要区别在于db.remove({})删除了所有文档,但您的集合仍然具有索引之类的元数据。 dropDatabase从字面上删除整个集合,包括元数据。

如果您正在重新创建收藏索引,或者您没有收集索引,请使用dropDatabase它的速度要快得多。

选中link以了解db.collection.drop() vs db.dropDatabase()

如果您正在学习 MongoDb ,我建议您阅读此book。它还解释了您的用例。

答案 1 :(得分:2)

我将用简单的词语解释并尝试简短:

Collection.remove(查询)

您要根据查询({})从集合中删除的任何内容。记住这一点?它在你的代码中。这实际上称为查询,当前查询{}中的空对象意味着它应匹配所有对象。现在为什么它没有释放所有空间,因为它为读写操作分配内存并保留以供将来使用。因此,您的数据总是小于 MongoDB 在物理内存上获得的空间。

它仅从1个集合中删除数据。在您的情况下,您只有一个集合。要了解它的工作方式,您可以按照link

进行操作

Db.dropDatabase()

它会从数据库,索引信息,基于集合的配置,内存中的所有内容中删除所有内容,因为没有配置也没有任何集合。您的空间可以免费使用。

它会删除所有集合中的所有数据以及所有集合的所有元数据。实际上它删除了数据库本身。在您的情况下,您可以依赖db.dropDatabase()以供将来使用。

查看它产生的效果here