MongoDB 功能详解之时间序列集合(Time Series Collections)

MongoDB 功能详解之时间序列集合(Time Series Collections)           

时间序列集合(Time Series Collections):MongoDB 5.0 版本中的新功能。

时间序列数据是一系列数据点,通过分析这些随时间变化的数据点而获得对数据的深刻理解。

时间序列数据通常由以下组成部分组成:

  • 时间:数据点何时被记录
  • 元数据(有时称为源):一个标签或标记,唯一标识一个序列,并且很少更改
  • 测量值(有时称为指标或值):按时间增量跟踪的数据点,通常是随时间变化的键-值对。

下表列出了一些时间序列数据的例子:

 

 

 

入门

 

要开始使用时间序列集合,请参阅文档:创建并查询时间序列集合

原文:Time Series

关于译者:

张清荣,MongoDB 中文社区成员,现就职于中国联通软件研究院。

【推荐阅读】

 

 MongoDB 如何创建并查询时间序列集合?

上一篇重点介绍了时间序列数据和 MongoDB 时间序列集合功能的基本情况,本篇则将着重通过示例代码展示如何创建和查询时间序列集合

 

创建时间序列集合

 

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

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

 

 

 

 

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() 方法。

📒 提示:

优化插入性能要了解如何为大型操作优化插入,请参阅优化插入(Optimize Inserts)

查询时间序列集合

 

可以按照查询标准 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")
}

 

在时间序列集合上进行聚合运算


对于额外的查询功能,可以使用聚合管道(aggregation pipeline),例如:

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
}

 

原文:Create and Query a Time Series Collection

关于译者:

张清荣,MongoDB 中文社区成员,现就职于中国联通软件研究院。

【推荐阅读】

 

数据库中的时间序列集合(List Time Series Collections in a Database)           

【相关导读】

>>> 技术干货 | MongoDB 如何创建并查询时间序列集合?

>>> 技术干货 | MongoDB 功能详解之时间序列集合(Time Series Collections)

在了解了时序数据、MongoDB 时间序列集合功能的基本情况,以及如何创建和查询时间序列集合之后,本篇将继续拓展讲解时间序列集合的相关内容。

我们可以在查询指令的条件中额外加入 type 属性,这样输出的集合结果中就会带有时间序列。也可以通过只包含 type 作为筛选条件的指令,列出数据库中的所有时间序列集合。

 

程序


使用列表集(listCollections)指令,并将过滤条件设为{ type: "timeseries" },就可以列出数据库中所有的时间序列集合。操作如下:

db.runCommand( {
   listCollections: 1,
   filter: { type: "timeseries" }
} )

 

输出

 

要获取时间序列集合作为输出结果,指令中筛选条件需要包括:

type: 'timeseries'

options: { timeseries: { ... } }

样例:

{
  cursor: {
    id: Long("0"),
    ns: 'test.$cmd.listCollections',
    firstBatch: [
      {
        name: 'weather',
        type: 'timeseries',
        options: {
          timeseries: {
            timeField: 'timestamp',
            metaField: 'metadata',
            granularity: 'hours',
            bucketMaxSpanSeconds: 2592000
          }
        },
        info: { readOnly: false }
      }
    ]
  },
  ok: 1
}

原文:List Time Series Collections in a Database关于译者:
刘东方,MongoDB 中文社区成员,现就职于中国联通软件研究院,目前专注于 MongoDB 数据库运维与技术支持。

社区招募

为了让社区组委会成员和志愿者朋友们灵活参与,同时我们为想要深度参与社区建设的伙伴们开设了“招募通道”,如果您想要在社区里面结交志同道合的技术伙伴,想要通过在社区沉淀有价值的干货内容,想要一个展示自己的舞台,提升自身的技术影响力,即刻加入社区贡献队伍~ 点击提交申请

社区合作

接下来我们会在诸多城市举办技术大会,如果您有优质的议题和 MongoDB 相关经验的嘉宾可以与我们分享,或者有赞助合作意向的小伙伴,包含但不限制于联合主办方、媒体合作等,都可以随时联系我们的社区助手小芒果(微信ID:mongoingcom)沟通具体事宜。

 

 

 

 

posted @   binbinx  阅读(1826)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示