mongodb 5.0 时间序列集合需先设 featurecompatibilityversion 为 "5.0",timeseries.timefield 必填且必须为 bson date 类型,granularity 限 "seconds"/"minutes"/"hours",metafield 不可与 timefield 同名或为 _id,5.0 不自动建索引需手动创建复合索引以避免全表扫描。

MongoDB 5.0 支持时间序列集合,但必须确保 featureCompatibilityVersion 已设为 "5.0",否则 db.createCollection() 会静默忽略 timeseries 选项,导致你以为创建成功,实际建的是普通集合。
创建时间序列集合前必须检查兼容版本
直接运行以下命令确认:
db.adminCommand({ getParameter: 1, featureCompatibilityVersion: 1 })
如果返回值不是 "5.0" 或更高(如 "4.4"),需先升级兼容版本:
db.adminCommand({ setFeatureCompatibilityVersion: "5.0" })
- 该操作需
clusterAdmin权限,且不可逆降级(例如从 5.3 降回 5.0.5 之前必须删掉所有时间序列集合) - 升级后重启 mongod 不是必须的,但建议在维护窗口执行
- Atlas 用户无需手动设置,新集群默认启用 5.0+ 兼容模式
db.createCollection() 中 timeseries 选项的关键约束
只有 timeseries.timeField 是必填项;其他字段一旦指定就必须符合类型和命名规则:
-
timeField值必须是字符串,且文档中该字段必须存 BSONDate类型(ISODate("...")),不能是字符串或数字时间戳 -
metaField名称不能与timeField相同,也不能是_id;它的值可以是嵌套对象(如{ sensorId: "A1", location: "NYC" }),但内容应稳定——频繁变更会导致桶分裂,影响写入性能 -
granularity只能是"seconds"、"minutes"或"hours";若采集间隔约 10 分钟,设为"minutes"比"seconds"更省空间和查询更快;设错不会报错,但会降低压缩率 - 不支持在已有集合上添加
timeseries选项,必须新建集合
正确示例:
db.createCollection("weather", {
timeseries: {
timeField: "ts",
metaField: "sensor",
granularity: "minutes"
}
})
写入数据时 timeField 字段必须是有效日期
插入文档时,timeField 对应字段若不是 BSON Date,MongoDB 会拒绝写入并报错:
WriteError({ "index": 0, "code": 183, "errmsg": "time field must be of type date" })
- 常见错误:用字符串如
"2026-07-21T10:30:00Z"直接赋值 —— 必须用ISODate("2026-07-21T10:30:00Z")或驱动中的new Date()/DateTime.parse() - Go 驱动中要传
time.Time类型,不能传字符串或 Unix 时间戳整数 - 批量插入时只要有一条文档的
timeField类型错误,整个批次都会失败(默认 ordered: true)
查询时间序列集合要注意索引隐式行为
MongoDB 5.0 不会自动创建复合索引;6.3+ 才默认为 timeField + metaField 建复合索引。5.0 下你得手动建:
db.weather.createIndex({ "ts": 1, "sensor": 1 })
否则按 sensor 过滤再按时间范围查,性能会急剧下降。
- 时间范围查询(如
{ ts: { $gte: ISODate("..."), $lt: ISODate("...") } })天然高效,因为数据按时间物理排序 - 但只查
{ sensor: "A1" }而不带时间条件,就是全表扫描——时间序列集合对此无优化 -
explain("executionStats")中若看到"stage": "COLLSCAN",基本说明缺索引或查询没命中索引前缀
粒度选错、metaField 设计不稳定、忘记手动建索引——这三个点最容易在 5.0 环境下让时间序列集合跑得比普通集合还慢。











