MongoDb + Mongoose QueryStream -以下文档更改



我试图在调度应用程序中使用Mongoose及其查询流,但也许我误解了它的工作原理。我在这里读过这个问题在SO [Mongoose QueryStream新结果,似乎我是正确的,但有人请解释:

如果我要过滤这样的查询-

Model.find().stream()

当我添加或更改与.find()匹配的东西时,它应该抛出data事件,正确吗?还是我对这个问题的理解完全错了?

例如,我想看一些数据,像这样:

 Events.find({'title':/^word/}).stream();

我正在改变mongodb控制台的标题,没有看到任何变化。

有谁能解释为什么吗?

您的理解确实是不正确的,因为流只是当前查询响应的输出流,而不是本身"侦听新数据"的东西。这里返回的结果基本上只是一个节点流接口,这是一个可选的选择,而不是"游标",或者直接转换为数组,就像mongoose方法默认做的那样。

所以"流"不只是"跟随"任何东西。这实际上只是处理查询的正常结果的另一种方式,但这种方式不会将所有结果一次性"吸进"内存。它使用事件侦听器来处理从服务器游标获取的每个结果。

你实际上谈论的是一个"可跟踪游标",或者它的一些变体。在基本的MongoDB操作中,可以在一个上限集合上实现一个"可跟踪游标"。这是一种具有特定规则的特殊类型的集合,因此它可能不适合您的目的。它们用于"仅插入"操作,这通常适合于事件队列。

在使用上限收集的模型上(并且仅在设置了上限收集的模型上),您可以这样实现:

var query = Events.find({'title':/^word/}).sort({ "$natural": -1}).limit(1);
var stream  = query.tailable({ "awaitdata": true}).stream();
// fires on data received
stream.on("data",function(data) {
    console.log(data);
});

这里的"awaitdata"与"tailable"选项本身一样重要,因为它是告诉查询游标保持"活动"并"跟踪"满足查询条件的集合中添加的内容的主要内容。但是你的集合必须被"封顶"才能工作。

另一种更高级的方法是做一些类似于流星分布的事情,其中被跟踪的"capped collection"实际上是MongoDB oplog。这需要一个副本集配置,但是就像meteor开箱即用一样,使用单个节点作为副本集本身并没有什么问题。在生产环境中这样做是不明智的。

这比简单的答案更高级,但基本的概念是,由于"oplog"是一个有上限的集合,因此您可以对数据库上的所有写操作"跟踪"它。然后检查此事件数据,以确定要监视的集合是否已写入等详细信息。然后,这些数据可以用来查询新的信息,并通过websocket或类似的方式将更新的或新的结果返回给客户端。

但是流本身就是一个流。要"跟踪"集合上的更改,您要么需要将其实现为有上限的,要么考虑按照所描述的基于观察oplog中的更改来实现流程。

相关内容

  • 没有找到相关文章

最新更新