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类型)必填(如timestamp)metaField分组字段(如股票代码),相同metaField值的数据会被分到同一桶必填(如symbol)granularity自动分桶粒度,可选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" });
性能优化补充
写入加速
// 批量插入(减少网络开销)
db.kline_1min.insertMany([
{ symbol: "600519.SH", timestamp: new Date(), ... },
{ symbol: "000001.SZ", timestamp: new Date(), ... }
], { ordered: false }); // 无序写入提升吞吐压缩率监控
# 通过mongostat查看压缩效果
mongostat --host localhost --discover -n 1 | grep kline_1min观察
dataSizevsstorageSize,ZSTD下比值通常≥3:1。
注意事项
时间字段不可变:一旦插入,
timeField不可更新,否则TTL失效。时钟同步:确保服务器时间准确,否则TTL可能提前/延迟触发。
分片限制:时间序列集合必须在创建时分片,后续不能修改分片键。