【问题标题】:Single Node.js/Mongoose stream from multiple unrelated MongoDB collections来自多个不相关 MongoDB 集合的单个 Node.js/Mongoose 流
【发布时间】:2021-09-08 09:58:35
【问题描述】:

我正在收集来自市场数据 websocket 流的大量数据。我正在从这个单一流中收集 2 种不同类型的事件,这些事件将与事件日期/时间一起存储,并且没有父/子数据库关系。由于数据结构的不同,它们被存储在各自的 MongoDB 集合中。

一旦存储了一定数量的数据(超过 10 万个事件),我将对事件进行分析,但我希望以按时间模拟原始单个事件流的方式进行分析(不单独处理两个收集流)。

如果可能的话,我希望能够从 Mongoose 进行一次查询,该查询将两个集合连接起来,按日期排序,并作为流输出以节省内存。因此,在这种情况下,由于事件的数量,性能很重要。

我在搜索解决方案时看到的所有答案都与某种父/子聚合有关,但由于这不是应用程序中与用户/用户数据相关的部分,所以我很难找到答案。

此外,将数据存储在 2 个单独的集合中似乎是必要的,因为它们的字段都不同,除了 time。但是...如果不再需要这种类型的解决方案,将这些事件保存在一个集合中会不会是利大于弊?

【问题讨论】:

    标签: node.js mongodb mongoose coinbase-api node-streams


    【解决方案1】:

    数据结构推理略有反转。 Mongodb 是无模式的,在同一个集合中具有不同结构的文档是很自然的。

    它使收集和分析数据变得容易,但会导致应用程序级别的问题,因为开发人员不能依赖数据结构并且必须在每次数据检索时对其进行验证。

    Mongoose 旨在通过在应用程序级别引入数据结构并承担所有常规验证任务来解决这个问题。有时,一个集合会存储多个模型,其中包含一些区分字段,以解决将文档解组到哪个字段。

    拥有来自多个集合的单个流是问题中最简单的部分,$unionWith 正是这样做的:

    db.collection1.aggregate( [
       { $unionWith: "collection2" },
       { $sort: { time: 1 } }
    ] )
    

    将文档解组为 mongoose 模型会稍微复杂一些 - 您需要手动完成,因为文档具有不同的结构。

    排序可能是个问题。 https://docs.mongodb.com/manual/core/aggregation-pipeline/#pipeline-operators-and-indexes 表示只要没有 $project、$unwind 和 $group 阶段,查询就可以从索引的“时间”列中受益,但我会仔细检查它是否可以在 $unionWith 阶段之后使用。

    将整个 websocket 流存储在一个集合中并直接从那里使用会简单得多。

    【讨论】:

    • 感谢您的详细解释。在阅读了这篇文章并更好地了解了 MongoDB 的灵活性之后,我相信更简单的方法毕竟是要走的路。
    猜你喜欢
    • 1970-01-01
    • 2013-08-20
    • 2020-05-31
    • 2021-10-25
    • 2017-05-03
    • 2017-10-17
    • 1970-01-01
    • 2019-11-25
    • 1970-01-01
    相关资源
    最近更新 更多