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})

适用于多租户系统或按业务分表场景。
应用场景
多租户架构:不同租户可拥有独立数据结构。
爬虫数据存储:不同来源的数据字段差异大,动态适配。
原型开发:需求快速验证阶段,避免频繁修改表结构。


三、核心差异对比

维度 固定集合 动态集合
容量限制 必须指定 sizemax,自动淘汰旧数据 无固定限制,可无限扩展
写入性能 极高(基于预分配内存与顺序写入) 适中(需处理动态字段索引)
数据淘汰机制 自动覆盖旧数据 需手动或通过 TTL 索引淘汰
适用场景 高频写入、数据临时性强的场景(如日志) 数据结构多变、需灵活扩展的场景(如用户行为)

四、选型建议

  1. 选择固定集合的条件
    • 数据具有时效性,无需长期存储(如实时监控)。
    • 要求极高写入性能且允许数据丢失。
  2. 选择动态集合的条件
    • 业务需求频繁变化,数据结构无法预定义(如快速迭代的互联网产品)。
    • 需支持多租户或分表存储(如电商平台按店铺分集合)。

五、注意事项

固定集合限制:不可转换为普通集合,但普通集合可通过 convertToCapped 命令转为固定集合。
动态集合索引优化:频繁变更字段时需谨慎设计索引,避免性能下降。
混合使用场景:例如在电商系统中,用固定集合存储订单操作日志,动态集合存储用户画像数据。


posted @ 2025-03-26 21:04  千陌666  阅读(58)  评论(0)    收藏  举报