mongodb8/8/2025

Mongodb时间序列创建

以下是 MongoDB 8.0 中创建时间序列集合(Time Series Collection)的完整语法,包含 ​​30天自动过期(TTL)​​ 和 ​​ZSTD压缩​​ 的配置:
// 创建时间序列集合(K线数据示例)
db.createCollection("kline_1min", {
  timeseries: {
    timeField: "timestamp",      // 必填:时间字段
    metaField: "symbol",         // 必填:股票代码等元数据字段
    granularity: "minutes",      // 可选:分钟级分桶(优化存储)
    bucketMaxSpanSeconds: 3600,  // 可选:每桶最大时间跨度(1小时)
    bucketRoundingSeconds: 300   // 可选:分桶对齐(5分钟边界)
  },
  expireAfterSeconds: 2592000,   // 30天自动过期(30 * 24 * 60 * 60)
  storageEngine: {
    wiredTiger: {
      configString: "block_compressor=zstd"  // 启用ZSTD压缩
    }
  }
});

// 创建复合索引(加速查询)
db.kline_1min.createIndex({ 
  "symbol": 1, 
  "timestamp": 1 
}, { 
  name: "idx_symbol_timestamp" 
});


​​关键参数解析​​

​​参数​​​​作用​​​​推荐值​​timeField指定时间戳字段(必须是BSON Date类型)必填(如timestampmetaField分组字段(如股票代码),相同metaField值的数据会被分到同一桶必填(如symbolgranularity自动分桶粒度,可选seconds/minutes/hoursminutes(适合K线)bucketMaxSpanSeconds单个桶内最大时间跨度(秒),超时自动分桶3600(1小时)bucketRoundingSeconds分桶时间对齐(秒),避免桶边界碎片化300(5分钟对齐)expireAfterSeconds文档自动过期时间(秒),从timeField开始计算2592000(30天)block_compressor=zstd使用ZSTD压缩算法(比默认Snappy节省20%空间)必填


​​验证配置是否生效​​

​​1. 检查集合配置​​

// 查看集合选项

db.getCollectionInfos({ name: "kline_1min" });

// 输出应包含:
{
"type": "timeseries",
"options": {
"expireAfterSeconds": 2592000,
"timeseries": { ... },
"storageEngine": { "wiredTiger": { "configString": "block_compressor=zstd" } }
}
}

​​2. 测试TTL过期​​

// 插入测试数据(30天前)
db.kline_1min.insertOne({
symbol: "600519.SH",
timestamp: new Date(Date.now() - 31 * 24 * 60 * 60 * 1000), // 31天前
open: 180.50,
high: 185.30,
low: 178.20,
close: 182.80,
volume: 9876543
});

// 立即查询(应无结果,因TTL线程60秒运行一次)
db.kline_1min.find({ symbol: "600519.SH" });


​​性能优化补充​​

  1. ​写入加速​

    // 批量插入(减少网络开销)
    db.kline_1min.insertMany([
    { symbol: "600519.SH", timestamp: new Date(), ... },
    { symbol: "000001.SZ", timestamp: new Date(), ... }
    ], { ordered: false }); // 无序写入提升吞吐
  2. ​压缩率监控​

    # 通过mongostat查看压缩效果
    mongostat --host localhost --discover -n 1 | grep kline_1min
    • 观察dataSize vs storageSize,ZSTD下比值通常≥3:1。


​​注意事项​​

  1. ​时间字段不可变​​:一旦插入,timeField不可更新,否则TTL失效。

  2. ​时钟同步​​:确保服务器时间准确,否则TTL可能提前/延迟触发。

  3. ​分片限制​​:时间序列集合必须在创建时分片,后续不能修改分片键。