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

Dig*_*ore 3 mongodb

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

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

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

db.getCollection('activity').deleteMany({createdAt:{$lte: 1565375400000}})
Run Code Online (Sandbox Code Playgroud)

上述查询的结果是:

{ "acknowledged" : true, "deletedCount" : 1199713 }
Run Code Online (Sandbox Code Playgroud)

查询前后 show dbs 命令的输出为:

admin           0.000GB
local           0.000GB
logDb          17.203GB
Run Code Online (Sandbox Code Playgroud)

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

小智 5

我将简短地解释一下:

为什么会发生这种情况
通过使用 db.stats() 检查数据库,您会发现 mongoDB 有 storageSize(数据+未使用的空间)和 dataSize(数据库中的数据)。如果从数据库中删除文档,实际上会减少数据大小。这是因为 mongodb 遵循一种存储策略,我可以称之为“尽你所能,不予回报”。假设您有 15GB 的数据,并且删除了 5GB,MongoDB 将继续保留之前拥有的整个 15GB 磁盘空间,因此它可以在以后使用相同的空间来存储新数据。

我如何释放存储空间

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

 db.dropDatabase()
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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

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

由于您已经删除了文档,我建议您在维护窗口期间运行紧凑命令(如果它是关键环境),这将整理所有数据和索引的碎片并将空间释放回操作系统

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

谢谢你!