我有一个传感器连接到Raspi,使用Mongo收集数据。我每隔几天复制数据库(使用mongodump
),然后删除Mongo文件并重新启动传感器。
我在删除/使用Mongo时遇到了一些麻烦,并想了解我做错了什么。
最初,我使用了命令:
use [database]
db.[nameOfOnlyCollection].remove({})
清空数据库(它只有一个集合)。使用命令db.[nameOfOnlyCollection].count()
我可以验证集合是否为空。
然而,即使在此之后,Mongo仍然在Raspi上占用了大量空间。更具体地说,这些(看似与Mongo相关)的例子占据了几个空间:
然后我发现an answer建议命令db.dropDatabase()
删除数据库中的所有条目。
我现在同时运行db.[nameOfCollection].remove({})
和db.dropDatabase()
,这解决了问题。意思是,Mongo不再需要太多的演出。但是,我想了解发生了什么。
命令remove
和dropDatabase
之间有什么区别?什么时候应该使用一个,当另一个? (我正在同时运行 - 这真是太傻了吗?)另外,有没有人知道为什么即使在运行remove
之后Mongo仍然占用了大量空间?
任何相关阅读的链接都将受到赞赏。 (但最好是关于“傻瓜”级别的读数。说我是一个Mongo noob会对实际的Mongo新手侮辱。)
答案 0 :(得分:2)
主要区别在于db.remove({})
删除了所有文档,但您的集合仍然具有索引之类的元数据。 dropDatabase
从字面上删除整个集合,包括元数据。
如果您正在重新创建收藏索引,或者您没有收集索引,请使用dropDatabase
它的速度要快得多。
选中link以了解db.collection.drop()
vs db.dropDatabase()
如果您正在学习 MongoDb ,我建议您阅读此book。它还解释了您的用例。
答案 1 :(得分:2)
我将用简单的词语解释并尝试简短:
您要根据查询({})
从集合中删除的任何内容。记住这一点?它在你的代码中。这实际上称为查询,当前查询{}
中的空对象意味着它应匹配所有对象。现在为什么它没有释放所有空间,因为它为读写操作分配内存并保留以供将来使用。因此,您的数据总是小于 MongoDB 在物理内存上获得的空间。
它仅从1个集合中删除数据。在您的情况下,您只有一个集合。要了解它的工作方式,您可以按照link
进行操作它会从数据库,索引信息,基于集合的配置,内存中的所有内容中删除所有内容,因为没有配置也没有任何集合。您的空间可以免费使用。
它会删除所有集合中的所有数据以及所有集合的所有元数据。实际上它删除了数据库本身。在您的情况下,您可以依赖db.dropDatabase()
以供将来使用。
查看它产生的效果here