MongoDB转换为固定集合后集合大小不符合预期的问题咨询
问题:MongoDB转换固定集合后文档数量不符合预期
我搭建了MongoDB v6.0.3环境,尝试将一个预先填充10个文档的普通集合转换为size为5的固定集合。使用的脚本如下:
db.testCollection.drop(); db.testCollection.insertMany([ {"key": 1}, {"key": 2}, {"key": 3}, {"key": 4}, {"key": 5}, {"key": 6}, {"key": 7}, {"key": 8}, {"key": 9}, {"key": 10}, ]); db.runCommand({"convertToCapped": "testCollection", size: 5});
但验证结果时,得到8个文档而非预期的5个:
db.testCollection.countDocuments(); // output: 8 db.testCollection.find(); // output: document with key from 3 to 10
我已尝试以下操作:
- 使用MongoDB v5.0.3验证该行为,结果相同
- 插入更多记录,查看是否会恢复到预期的5个文档,结果依旧
db.testCollection.insertOne({"key": 11}); db.testCollection.countDocuments(); // output: 8 db.testCollection.find(); // output: document with key from 4 to 11 - 在v6.0.3环境中修改固定集合大小,结果仍相同
db.runCommand( { collMod: "testCollection", cappedSize: 5 } )
请问该异常行为的原因是什么?
原因分析
核心问题是误解了size参数的定义:
convertToCapped和collMod中的size/cappedSize参数,指定的是固定集合的存储空间上限(单位为字节),而非文档的数量。你设置的size:5仅代表5字节,但单个MongoDB文档本身就远大于这个值——每个文档包含自动生成的_id字段、key字段,加上BSON格式的存储开销,至少需要几十字节。- MongoDB的存储引擎(如WiredTiger)有最小存储分配单元限制(默认是4KB),即使你设置的
size远小于这个值,MongoDB也会自动将固定集合的容量提升到符合存储引擎要求的最小值。这就是为什么你的固定集合能容纳8个文档,而非预期的5个。
你可以执行db.testCollection.stats()查看固定集合的实际参数,会发现cappedSize的实际值远大于你设置的5字节。
内容的提问来源于stack exchange,提问作者ray
相关产品推荐
相关产品推荐

