Docs 菜单
Docs 主页
/
MongoDB Manual
/

创建和查询时间序列集合

在此页面上

  • 创建时间序列集合
  • 在时间序列集合中插入测量值
  • 查询时间序列集合
  • 在时间序列集合上运行聚合

本页通过代码示例介绍如何创建和查询time-series collection。

在将数据插入时间序列集合之前,必须使用 db.createCollection() 方法或 create 命令显式创建集合:

db.createCollection(
"weather",
{
timeseries: {
timeField: "timestamp",
metaField: "metadata",
granularity: "hours"
}
}
)

注意

特征兼容性版本

您只能在 FeatureCompatibilityVersion 设置为 5.0 或更高版本的系统上创建时间序列集合。

创建时间序列集合时,请指定以下选项:

字段
类型
说明
timeseries.timeField
字符串

必需。包含每个时间序列文档中日期的字段的名称。时间序列集合中的文档必须具有有效 BSON 日期,以作为 timeField 的值。

timeseries.metaField
字符串

可选。包含每个时间序列文档中元数据的字段的名称。指定字段中的元数据应用于标识一系列唯一文档的数据。元数据应该很少改变(如果有的话)。

指定字段的名称不能是 _id,也不能与 timeseries.timeField 相同。字段可以是任何类型。

timeseries.granularity
字符串

可选。可能的值为:

  • "seconds"

  • "minutes"

  • "hours"

默认情况下,MongoDB 将 granularity 设置为 "seconds" 以进行高频提取。

手动设置 granularity 参数,通过优化时间序列集合中数据的内部存储方式来提高性能。要选择 granularity 的值,请选择与连续传入测量之间的时间跨度最接近的匹配项。

如果您指定 timeseries.metaField,请考虑 metaField 字段具有相同唯一值的连续传入测量值之间的时间跨度。如果测量值来自同一来源,则 metaField 字段通常具有相同的唯一值。

如果未指定 timeseries.metaField,请考虑插入到集合中的所有测量值之间的时间跨度。

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
}

后退

时间序列