来自多个不相关 MongoDB 集合的单个节点。js/Mongoose 流

Single Node.js/Mongoose stream from multiple unrelated MongoDB collections

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

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

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

我在搜索解决方案时看到的所有答案都与某种 parent/child 聚合有关,但由于这不是应用程序的 user/userData-related 部分,我遇到了麻烦寻找答案。

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

数据结构推理略有反转。 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 流存储在一个集合中并直接从那里使用它会简单得多。