在 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 不再占用演出空间。但是,我想了解发生了什么。
remove
和dropDatabase
命令有什么区别?什么时候应该使用一个,什么时候使用另一个? (我都在运行 - 这很傻吗?)另外,有谁知道为什么即使在运行 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 清空数据库?或两者?的主要内容,如果未能解决你的问题,请参考以下文章