You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 19:25:29