创建和查询时间序列集合
本页展示了如何创建和查询时间序列集合,并提供了代码示例。
创建时间序列集合
使用以下两种方法之一为每个数据桶定义时间间隔
定义一个
granularity
字段{ granularity: "seconds" } 有关选择
granularity
值的更多信息,请参阅 粒度注意事项。
或者
在 MongoDB 6.3 及更高版本中,您可以定义
bucketMaxSpanSeconds
和bucketRoundingSeconds
字段。这两个值必须相同{ bucketMaxSpanSeconds: "300", bucketRoundingSeconds: "300" }
可选地,设置 expireAfterSeconds
以在 timeField
的值至少那么旧时过期文档
{ expireAfterSeconds: 86400 }
使用 db.createCollection()
方法或 create
命令创建集合。以下示例使用 db.createCollection()
方法创建一个 weather
时间序列集合
db.createCollection( "weather", { timeseries: { timeField: "timestamp", metaField: "metadata", granularity: "seconds" }, expireAfterSeconds: 86400 } )
时间序列字段参考
时间序列集合包含以下字段
字段 | 类型 | 描述 |
---|---|---|
timeseries.timeField | 字符串 | 必需。包含每个时间序列文档中日期的字段名称。时间序列集合中的文档必须使用有效的 BSON 日期作为 |
timeseries.metaField | 字符串 | 可选。包含每个时间序列文档中元数据的字段名称。指定字段中的元数据应该是用于标记唯一文档序列的数据。元数据很少或几乎不改变。指定字段的名称不能是 虽然 |
timeseries.granularity | 整数 | 可选。如果设置了 可能的值是 将 有关粒度和分桶间隔的更多信息,请参阅 为时间序列数据设置粒度。 |
timeseries.bucketMaxSpanSeconds | 整数 | 可选。与 可能的值是 1-31536000。 新在版本6.3. |
timeseries.bucketRoundingSeconds | 整数 | 可选。与 当文档需要一个新桶时,MongoDB 会将文档的时间戳值向下舍入此间隔,以设置桶的最小时间。 新在版本6.3. |
expireAfterSeconds | 整数 | 可选。通过指定文档过期的秒数,启用时间序列集合中文档的自动删除。MongoDB会自动删除过期的文档。有关更多信息,请参阅设置时间序列集合的自动删除(TTL)。 |
其他允许的选项(非时间序列集合特定)包括
storageEngine
indexOptionDefaults
collation
writeConcern
comment
将测量值插入时间序列集合
您插入的每个文档应包含一个单独的测量值。要一次性插入多个文档,请执行以下命令
db.weather.insertMany( [ { metadata: { sensorId: 5578, type: "temperature" }, timestamp: ISODate("2021-05-18T00:00:00.000Z"), temp: 12 }, { metadata: { sensorId: 5578, type: "temperature" }, timestamp: ISODate("2021-05-18T04:00:00.000Z"), temp: 11 }, { metadata: { sensorId: 5578, type: "temperature" }, timestamp: ISODate("2021-05-18T08:00:00.000Z"), temp: 11 }, { metadata: { sensorId: 5578, type: "temperature" }, timestamp: ISODate("2021-05-18T12:00:00.000Z"), temp: 12 }, { metadata: { sensorId: 5578, type: "temperature" }, timestamp: ISODate("2021-05-18T16:00:00.000Z"), temp: 16 }, { metadata: { sensorId: 5578, type: "temperature" }, timestamp: ISODate("2021-05-18T20:00:00.000Z"), temp: 15 }, { metadata: { sensorId: 5578, type: "temperature" }, timestamp: ISODate("2021-05-19T00:00:00.000Z"), temp: 13 }, { metadata: { sensorId: 5578, type: "temperature" }, timestamp: ISODate("2021-05-19T04:00:00.000Z"), temp: 12 }, { metadata: { sensorId: 5578, type: "temperature" }, timestamp: ISODate("2021-05-19T08:00:00.000Z"), temp: 11 }, { metadata: { sensorId: 5578, type: "temperature" }, timestamp: ISODate("2021-05-19T12:00:00.000Z"), temp: 12 }, { metadata: { sensorId: 5578, type: "temperature" }, timestamp: ISODate("2021-05-19T16:00:00.000Z"), temp: 17 }, { metadata: { sensorId: 5578, type: "temperature" }, timestamp: ISODate("2021-05-19T20:00:00.000Z"), temp: 12 } ] )
要插入单个文档,请使用db.collection.insertOne()
方法。
查询时间序列集合
您可以通过与查询标准MongoDB集合相同的方式查询时间序列集合。
要从时间序列集合返回一个文档,请运行
db.weather.findOne( { timestamp: ISODate("2021-05-18T00:00:00.000Z") } )
示例输出
{ timestamp: ISODate("2021-05-18T00:00:00.000Z"), metadata: { sensorId: 5578, type: 'temperature' }, temp: 12, _id: ObjectId("62f11bbf1e52f124b84479ad") }
有关时间序列查询的更多信息,请参阅查询最佳实践。
在时间序列集合上运行聚合操作
为了增加查询功能,请使用聚合管道,例如
db.weather.aggregate( [ { $project: { date: { $dateToParts: { date: "$timestamp" } }, temp: 1 } }, { $group: { _id: { date: { year: "$date.year", month: "$date.month", day: "$date.day" } }, avgTmp: { $avg: "$temp" } } } ] )
示例聚合管道将所有文档按测量日期分组,然后返回该日所有温度测量的平均值
{ "_id" : { "date" : { "year" : 2021, "month" : 5, "day" : 18 } }, "avgTmp" : 12.714285714285714 } { "_id" : { "date" : { "year" : 2021, "month" : 5, "day" : 19 } }, "avgTmp" : 13 }