MongoDB 中 固定集合(Capped Collection) 与 动态集合(Dynamic Collection)
一、固定集合(Capped Collection)
1. 核心特性
• 固定容量:预先定义集合的最大存储空间(size)或最大文档数(max),当容量耗尽时,自动覆盖最旧文档。
• 环形队列结构:类似循环缓冲区,写入新数据时自动淘汰旧数据,无需手动删除。
• 高性能:基于插入顺序存储和查询,适用于高频写入场景(如日志、实时监控)。
• 限制操作:不支持分片、事务中的写操作(MongoDB 4.2+),且不能直接删除文档(仅能通过 drop() 清空集合)。
2. 创建与使用
• 创建命令:
db.createCollection("cap_log", {
capped: true,
size: 1000000, // 1MB存储空间
max: 1000 // 最多保留1000条文档
});
优先以 size 限制容量,max 限制文档数为补充。
• 应用场景:
• 日志系统:如 Web 服务器日志,仅需保留最新记录。
• 实时数据流:传感器数据、股票价格等时间序列数据。
• 缓存与消息队列:限制存储空间并保持高效读写。
二、动态集合(Dynamic Collection)
1. 核心特性
• 无预定义模式:集合结构可动态调整,允许文档字段自由增减或类型变化。
• 灵活扩展:无需预先声明字段,支持嵌套文档、数组等复杂数据结构。
• 适用快速迭代:适合业务需求频繁变化的场景(如社交平台动态字段)。
2. 实现与操作
• 动态创建集合:直接插入文档即自动生成集合,或通过编程动态命名:
# Python示例:根据店铺名动态创建集合
shop_name = "store_123"
mongo_db = client["my_database"]
collection = mongo_db[shop_name] # 动态生成集合
collection.insert_one({"product": "itemA", "price": 99})
适用于多租户系统或按业务分表场景。
• 应用场景:
• 多租户架构:不同租户可拥有独立数据结构。
• 爬虫数据存储:不同来源的数据字段差异大,动态适配。
• 原型开发:需求快速验证阶段,避免频繁修改表结构。
三、核心差异对比
| 维度 | 固定集合 | 动态集合 |
|---|---|---|
| 容量限制 | 必须指定 size 或 max,自动淘汰旧数据 |
无固定限制,可无限扩展 |
| 写入性能 | 极高(基于预分配内存与顺序写入) | 适中(需处理动态字段索引) |
| 数据淘汰机制 | 自动覆盖旧数据 | 需手动或通过 TTL 索引淘汰 |
| 适用场景 | 高频写入、数据临时性强的场景(如日志) | 数据结构多变、需灵活扩展的场景(如用户行为) |
四、选型建议
- 选择固定集合的条件:
• 数据具有时效性,无需长期存储(如实时监控)。
• 要求极高写入性能且允许数据丢失。 - 选择动态集合的条件:
• 业务需求频繁变化,数据结构无法预定义(如快速迭代的互联网产品)。
• 需支持多租户或分表存储(如电商平台按店铺分集合)。
五、注意事项
• 固定集合限制:不可转换为普通集合,但普通集合可通过 convertToCapped 命令转为固定集合。
• 动态集合索引优化:频繁变更字段时需谨慎设计索引,避免性能下降。
• 混合使用场景:例如在电商系统中,用固定集合存储订单操作日志,动态集合存储用户画像数据。

浙公网安备 33010602011771号