【问题标题】:MongoDb + Mongoose QueryStream - Following document changesMongoDb + Mongoose QueryStream - 以下文档更改
【发布时间】:2015-10-22 12:35:45
【问题描述】:

我正在尝试在调度应用程序中使用 Mongoose 及其查询流,但我可能误解了它的工作原理。我在 SO [Mongoose QueryStream new results 上读过这个问题,看来我是对的,但请有人解释一下:

如果我像这样过滤查询 -

Model.find().stream()

当我添加或更改与.find() 匹配的内容时,它应该引发data 事件,对吗?还是我对这个问题的理解完全错了?

例如,我正在尝试查看一些数据,如下所示:

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

我正在 mongodb 控制台中更改标题,但没有看到任何更改。

谁能解释一下原因?

【问题讨论】:

    标签: node.js mongodb mongoose stream mongodb-query


    【解决方案1】:

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

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

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

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

    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”选项本身一样重要,因为它是告诉查询游标保持“活动”和“尾”添加到集合中满足查询条件。但您的收藏必须设置“上限”才能正常工作。

    另一种更先进的方法是执行类似于meteor 分发的操作,其中被跟踪的“上限集合”实际上是MongoDB oplog。这需要replica set 配置,但是就像meteor 开箱即用一样,将单个节点作为副本集本身并没有错。在生产中这样做是不明智的。

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

    但流本身就是一个流。要“跟踪”集合上的更改,您需要将其实现为上限,或者考虑根据所述观察 oplog 中的更改来实现流程。

    【讨论】:

    • 谢谢。这是一个非常棒的解释。我已经将它设置为一个有上限的集合,所以我必须进一步调查。在任何一种情况下,我认为这意味着如果我正在寻找诸如时间戳之类的东西,它只会返回在我执行该 .find 之后插入的内容的结果,对吗?它不会轮询继续检查吗?
    • @afitings 在第一次执行查询时(由事件侦听器轮询),将返回与条件匹配的所有结果。我只是在示例中要求limit(1),因为您通常只想关注。之后,由于服务器上的游标保持打开状态,因此返回所有新插入的数据。除了插入之外,这不会跟踪文档“更改”。为此,您需要查看 oplog。所以一般来说,只是在监听之后插入新的内容。
    猜你喜欢
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 2017-01-06
    • 1970-01-01
    • 2021-03-26
    • 2011-12-04
    • 2016-10-15
    • 1970-01-01
    相关资源
    最近更新 更多