从Db中删除文档后,存储空间不会减少。为什么?

时间:2019-08-22 07:29:33

标签: mongodb

我通过在shell上运行deleteMany查询删除了集合的文档,并返回了确认的true和result。

即使删除了大约一百万个文档后,运行show dbs命令时数据库的大小也是相同的。

我在shell上执行的删除查询:

db.getCollection('activity').deleteMany({createdAt:{$lte: 1565375400000}})

上述查询的结果是:

{ "acknowledged" : true, "deletedCount" : 1199713 }

在查询之前和之后,show dbs命令的输出为:

admin           0.000GB
local           0.000GB
logDb          17.203GB

为什么不减小数据库大小,我该怎么做才能释放该大小?

2 个答案:

答案 0 :(得分:3)

我要简短地解释一下:

为什么会发生
通过使用db.stats()检查数据库,您将认识到mongoDB具有storageSize(数据+未使用的空间)和dataSize(数据库中的数据)。如果从数据库中删除文档,则实际上是在减小dataSize。这是因为mongodb遵循一种存储策略,我可以称其为“力所能及,不给任何回报”。假设您有15GB的数据并删除了5GB,MongoDB将继续保留之前拥有的全部15 GB磁盘空间,因此以后可以使用相同的空间来存储新数据。

我如何释放存储空间

如果您处于开发环境中,我建议转储数据库,将其删除然后再还原。
1.这是创建备份的方式:        https://docs.mongodb.com/manual/reference/program/mongodump/
2.通过在mongo shell中执行来删除数据库:

 db.dropDatabase()

然后是mongorestore(这是指向文档的链接:https://docs.mongodb.com/manual/reference/program/mongorestore/

答案 1 :(得分:3)

MongoDB不会将空间释放回磁盘。相反,它将保留考虑未来增长的空间

运行内务处理的正确方法是删除不需要的集合或删除不需要的数据库(确保进行备份),这会将空间释放回操作系统

既然您已经删除了文档,我建议您在维护窗口(如果它是关键环境)期间运行compact命令,这将对所有数据和索引进行碎片整理并将空间释放回OS

https://docs.mongodb.com/manual/reference/command/compact/

谢谢!