node.js - MongoDb + Mongoose QueryStream - 以下文档更改

标签 node.js mongodb mongoose stream mongodb-query

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

如果我像这样过滤查询 -

Model.find().stream()

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

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

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

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

谁能解释一下为什么?

最佳答案

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

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

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

在使用上限集合的模型上(并且仅在设置了上限集合的地方)然后您可以这样实现:

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 开箱即用一样,将单个 Node 作为副本集本身并没有错。在生产中这样做是不明智的。

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

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

关于node.js - MongoDb + Mongoose QueryStream - 以下文档更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31735870/

相关文章:

node.js - 风 sails .js : Waterline OR filter not working

c++ - 如何将 v8::String 转换为 const char *

node.js - 需要对属于一篇文章的多个评论做关系 MongoDB

node.js - MongoDB/Mongoose 查询 : How to get different sets of data based on a field's value

mongodb - 查询以查找 mongodb 图集合中的连接组件?

node.js - 在 Windows 7 上使用 npm 设置 Mongo DB 时遇到问题...有什么想法吗?

JavaScript- "Image not found"除非我刷新页面

node.js - TFS(内部)构建输出显示错误的字符编码

mongodb - mongodb、couchdb在单节点上是否一致?

javascript - Mongoose near(...) 对 2dsphere 索引字段的查询未返回有效结果