【问题标题】:Every 'nth' document from a collection - MongoDB + NodeJS集合中的每个“第 n 个”文档 - MongoDB + NodeJS
【发布时间】:2019-02-04 19:34:26
【问题描述】:

我正在寻找一种方法来返回存储在 MongoDB 中的不同分辨率的数据。我能想到的最优雅的解决方案是从集合中返回每个“第 n 个”(第二个、第三个、第十个等)文档的查询。

我以 5 秒的间隔存储数据(比如温度),但想查看数据中的不同趋势。

为了找到瞬时趋势,我查看了最后 720 个条目(1 小时)。这部分很简单。

如果我想查看稍微长一点的趋势,比如 3 小时,我可以检索最后 2160 个条目(3 小时),但是从服务器中提取的时间更多,绘制的时间和内存也更多。在查看更大的趋势时,小动作是噪音,我最好检索相同数量的文档(720),但每 3 次检索一次,仍然给我 3 小时的结果,使用相同的资源,对于未成年人牺牲细节。

当我想查看几周(120,960 个文档)或几个月(500,000+ 个文档)时,这只会变得更加极端。

我当前的代码收集每个文档(n = 1):

db.collection(collection).find().sort({$natural:-1}).limit(limit)

然后我可以遍历返回的数组并在以下情况下删除每个文档:

index % n != 0

这至少使客户端免于处理所有数据,但这似乎效率极低,我宁愿数据库处理这部分。

有谁知道实现这个的方法吗?

【问题讨论】:

    标签: node.js mongodb


    【解决方案1】:

    显然,mongo 中没有内置的解决方案可以解决您的问题。

    未来的方法是智能地以片段的形式归档您的数据。

    因此,您可以将数据存储在一个集合中,该集合最多可容纳每周或每月的数据。新的一个月/一周意味着将您的数据存储在不同的集合中。这样你就不会进行全表扫描,也不会像你在问题中提到的那样收集每一个文档。您的应用程序代码将决定查询哪个集合。

    如果我站在你的立场上,我会使用不同的工具,因为 mongo 更适合通用数据库。像 cassandra 这样的数据库可以很好地处理时间序列数据(每 5 秒存储一次),它可以轻松处理频繁的写入,就像您的情况一样。

    备用碎片(更新): 始终将当前数据写入集合“week0”,并在后台运行每周调度程序,将数据从“week0”移动到历史集合“week1”、“week2”等等。分片逻辑取决于您的要求。

    【讨论】:

      【解决方案2】:

      我认为 $bucket 阶段可能会对您有所帮助。 你可以做类似的事情,

      db.collection.aggregate([
        {
          $bucketAuto: {
            groupBy: "$_id", // here you'll put the variable you need, in your example 'temperature'
            buckets: 5 // this is the number of documents you want to return, so if you want a sample of 500 documents, you can put 500 here
          }
        }
      ])
      

      上述查询结果中的每个文档都是这样的,

          "_id": {
            "max": 3,
            "min": 1
          },
          "count": 2
      

      如果您按温度分组,则每个文档都将具有该样本中找到的最低和最高温度

      【讨论】:

        【解决方案3】:

        您可能还有其他问题。 Docs 声明不要依赖自然排序:

        此排序是内部实现功能,您应该 不依赖于其中的任何特定结构。

        您可以改为保存每个文档中的纪元秒数,并在查询中对其进行 mod 算术运算,包括限制和排序。

        【讨论】:

          猜你喜欢
          • 2021-09-04
          • 1970-01-01
          • 1970-01-01
          • 2021-10-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-01
          相关资源
          最近更新 更多