创建和查询时间序列集合
本页通过代码示例介绍如何创建和查询time-series collection。
创建时间序列集合
在将数据插入时间序列集合之前,必须使用 db.createCollection()
方法或 create
命令显式创建集合:
db.createCollection( "weather", { timeseries: { timeField: "timestamp", metaField: "metadata", granularity: "hours" } } )
timeseries
对象字段
创建时间序列集合时,请指定以下选项:
字段 | 类型 | 说明 |
---|---|---|
timeseries.timeField | 字符串 | 必需。包含每个时间序列文档中日期的字段的名称。时间序列集合中的文档必须具有有效 BSON 日期,以作为 |
timeseries.metaField | 字符串 | 可选。包含每个时间序列文档中元数据的字段的名称。指定字段中的元数据应用于标识一系列唯一文档的数据。元数据应该很少改变(如果有的话)。 指定字段的名称不能是 |
timeseries.granularity | 字符串 | 可选。可能的值为:
默认情况下,MongoDB 将 手动设置 如果您指定 如果未指定 |
expireAfterSeconds | 数字 | 可选。 通过指定文档过期后的秒数,启用自动删除time-series collection中的文档功能。MongoDB 会自动删除过期文档。 有关详细信息,请参阅设置时间序列集合 (TTL) 的自动删除。 |
允许与timeseries
选项一起使用的其他选项包括:
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 }