MongoDB 对于许多传感器的最佳实践(+50k)但更新缓慢(每 12 小时)

问题描述 投票:0回答:1

我正在尝试获取一些有关如何正确构建 MongoDB 数据库的建议。我在 Mongo Atlas M10 上,我的数据结构如下所示:

{
    sensorId: "12345",
    epoch: Date,
    datum_1: "string",
    datum_2: "string",
    ...
}

假设我有 50,000 多个传感器,而且数量还在不断增加,但更新率仅为每天两次。我看过很多关注物联网的帖子,但它们主要关注相对少量的传感器和高速率的数据输入。 (或其他例子,如金融/股票;高利率、低数量的公司)

最后,我想在 GUI 中显示特定传感器的历史数据。

需要补充的一件事是,我真的不想在

sensorId
epoch
中出现重叠的重复条目。


任何建议将不胜感激!对我来说,由于传感器的数量和“缓慢”的更新节奏,几乎似乎我不应该将它们放在一起,而只是有一个扁平的结构......我什至不知道此时真正要搜索什么。

这是我目前所知道的:

  1. Timeseries MongoDB 数据库是不可能的,因为我只能通过元数据来

    $match
    条目,而不是时间戳本身(例如,查找具有相同 ID + 时间戳的条目是否存在;如果不存在,则添加);无论如何,这似乎是一个没有实际意义的问题,因为我无法使用 Timeseries DB 来查找现有条目并插入它们(更新插入)。

  2. 我不应该有一个基于“传感器”的文档在数组中附加新的数据点,因为“文档”在 MongoDB 上有 16MB 的限制;我相信也有数组长度限制。我应该将每个数据点存储/存储为文档。

  • 2A。我还看到一些帖子通过每个传感器有一个“集合”来划分数据,但这似乎不可扩展......
  1. 很多有关物联网的文章都讨论了少量传感器和高输出。因此,他们通过时间增量(秒、分钟、小时)对它们进行存储。然而,我的用例几乎相反,我有很多传感器输出数据非常慢(相对而言)。
database mongodb database-design iot
1个回答
0
投票

一些可能有帮助的见解。 与 MongoDB 中的常规集合相比,使用时间序列集合的优点之一是可以实现更好的数据压缩,从而降低磁盘使用率。为了实现这一目标,您希望将尽可能多的测量数据装入一个桶中。

  • 每个文档应在逻辑上代表一种测量。不要将多个文件打包到一个文档中,这会对磁盘使用/压缩产生负面影响。
  • 你不应该给自己装桶,把它留给数据库。选择正确的粒度。就您而言,最长的,
    hours
    ,将是最好的。也许甚至可以通过一些服务器参数定制
  • 使用
    metaField
    (docs),而不是单独的集合,将传感器切片到单独的桶中。
  • MongoDB 的每个新主要版本都对时间序列进行了重大改进,因此尽可能使用最新版本将产生最大的好处。

至于

$match
不允许出现在时间序列上......你有例子或引文吗?从文档herehere(包含示例)来看,我没有看到您在该领域提到的局限性的证据。

这些文档页面应该有所帮助:

© www.soinside.com 2019 - 2024. All rights reserved.