首页 > 编程笔记 > MongoDB 阅读:6

MongoDB创建时间序列集合(附带实例)

在使用时间序列集合时需要注意,由于 MongoDB 数据库版本的兼容性,设计人员只能在 FeatureCompatibilityVersion 设置为 5.0 或更高版本的系统上创建时间序列集合。

MongoDB 使用 db.createCollection() 方法或 create 命令创建集合,具体代码如下:
db.createCollection("weather", {
    timeseries: {
        timeField: "timestamp",
        metaField: "metadata"
    }
})
上面的代码将 timeField 字段设置为包含时间数据的字段,将 metaField 字段设置为包含元数据的字段。

创建时间序列集合后,设计人员可以使用 collMod 方法修改时间序列粒度或存储桶定义。但是,设计人员只能增加每个存储桶涵盖的时间跨度,却无法减少。可以通过定义一个granularity 字段来实现,具体代码如下:
timeseries: {
    timeField: "timestamp",
    metaField: "metadata",
    granularity: "seconds"
}

在 MongoDB 6.3 及更高版本中,设计人员可以定义 bucketMaxSpanSeconds 和 bucketRoundingSeconds 字段,且这两个字段的值必须相同,具体代码如下:
timeseries: {
    timeField: "timestamp",
    metaField: "metadata",
    bucketMaxSpanSeconds: "300",
    bucketRoundingSeconds: "300"
}

还有一种可选的方式,即设置 expireAfterSeconds 字段,使文档在 timeField 的值达到该值时以及达到该值之后均过期:
timeseries: {
    timeField: "timestamp",
    metaField: "metadata",
    granularity: "seconds"
},
expireAfterSeconds: 86400

在时间序列集合中插入测量值

在 MongoDB 中,设计人员插入的每个文档都应包含一个测量值。例如,要同时插入多个天气测量值文档,可以执行以下命令:
db.weather.insertMany([
    {
        "metadata": { "sensorId": 6688, "type": "temperature" },
        "timestamp": ISODate("2024-08-18T00:00:00.000Z"),
        "temp": 12
    },
    {
        "metadata": { "sensorId": 6688, "type": "temperature" },
        "timestamp": ISODate("2024-08-18T08:00:00.000Z"),
        "temp": 11
    },
    {
        "metadata": { "sensorId": 6688, "type": "temperature" },
        "timestamp": ISODate("2024-08-18T16:00:00.000Z"),
        "temp": 16
    },
    {
        "metadata": { "sensorId": 6688, "type": "temperature" },
        "timestamp": ISODate("2024-08-18T20:00:00.000Z"),
        "temp": 15
    },
    {
        "metadata": { "sensorId": 6688, "type": "temperature" },
        "timestamp": ISODate("2024-08-19T08:00:00.000Z"),
        "temp": 11
    },
    {
        "metadata": { "sensorId": 6688, "type": "temperature" },
        "timestamp": ISODate("2024-08-19T16:00:00.000Z"),
        "temp": 17
    },
    {
        "metadata": { "sensorId": 6688, "type": "temperature" },
        "timestamp": ISODate("2024-08-19T20:00:00.000Z"),
        "temp": 12
    }
])
如果要插入单个文档,设计人员可以使用 db.weather.insertOne()方法进行操作。

相关文章