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

Posted

技术标签:

【中文标题】在 Mongodb 中:使用 remove 或 dropDatabase 清空数据库?或两者?【英文标题】:In Mongodb: use remove or dropDatabase to empty a database? Or both? 【发布时间】:2018-04-10 11:05:02 【问题描述】:

我有一个连接到 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

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

我现在同时运行db.[nameOfCollection].remove()db.dropDatabase(),这已经解决了问题。这意味着,Mongo 不再占用演出空间。但是,我想了解发生了什么。

removedropDatabase 命令有什么区别?什么时候应该使用一个,什么时候使用另一个? (我都在运行 - 这很傻吗?)另外,有谁知道为什么即使在运行 remove 之后 Mongo 仍然占用大量空间?

任何相关阅读的链接将不胜感激。 (但最好在“傻瓜”级别上阅读。说我是 Mongo 菜鸟是对真正的 Mongo 菜鸟的侮辱。)

【问题讨论】:

请查看答案。并标记是否有帮助 【参考方案1】:

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

如果您正在重新创建集合索引或没有它,请使用dropDatabase,它会更快。

查看此link 以了解db.collection.drop()db.dropDatabase()

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

【讨论】:

【参考方案2】:

我会用简单的语言解释并尽量简短:

Collection.remove(查询)

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

它仅从 1 个集合中删除数据。在您的情况下,您只有一个集合。要更深入地了解它是如何工作的,您可以关注link

Db.dropDatabase()

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

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

看看它会产生什么效果here

【讨论】:

感谢你们的回答和链接!两者都回答了我的问题,所以我接受了第一个回答。我对他们两个都投了赞成票,但没有足够的声誉让它“卡住”。仍然 - 谢谢! :) 感谢您的好意,请回来投票。我花了更长的时间来回答,因为我试图写得更清楚。很高兴我能帮上忙。嘿,如果你以后获得声誉,回来投票可能是:D 会做 :) 我收到一条通知,说我的赞成票已被注册,即使它没有在页面上显示。所以希望对你有一些好处。如果我在声望游戏中取得成功,我一定会回来的^^

以上是关于在 Mongodb 中:使用 remove 或 dropDatabase 清空数据库?或两者?的主要内容,如果未能解决你的问题,请参考以下文章

mongodb之remove操作

MongoDB删除文档

mongodb中drop和remove的区别

MongoDB 删除文档

MongoDB 删除文档

MongoDB——文档操作(删除文档)