我正在尝试在调度应用程序中使用Mongoose及其查询流,但也许我误解了它是如何工作的.我已经在SO [
Mongoose QueryStream new results上看到了这个问题,看起来我是对的,但有人请解释一下:
如果我正在过滤这样的查询 –
Model.find().stream()
当我添加或更改与.find()匹配的内容时,它应该抛出一个数据事件,对吗?或者我对这个问题的理解完全错了?
例如,我正在尝试查看一些数据,如下所示:
Events.find({'title':/^word/}).stream();
我正在更改mongodb控制台中的标题,并没有看到任何更改.
有谁能解释为什么?
最佳答案 您的理解确实不正确,因为流只是当前查询响应的输出流,而不是“自己监听新数据”的内容.这里返回的结果基本上只是一个节点
streaming interface,这是一个可选的选择而不是“游标”,或者实际上是默认情况下mongoose方法直接转换为数组.
所以“流”不只是“跟随”任何东西.它只是处理查询的正常结果的另一种方式,但其方式是不会立即将所有结果“淹没”到内存中.它更确切地说,它使用事件侦听器来处理从服务器游标中获取的每个结果.
你实际上在谈论的是“tailable cursor”,或其中的一些变体.在基本的MongoDB操作中,可以在capped collection上实现“tailable cursor”.这是一种具有特定规则的特殊类型的集合,因此可能不适合您的目的.它们用于“仅插入”操作,通常适用于事件队列.
在使用上限集合的模型上(并且仅在已设置上限集合的位置),您实现如下:
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配置,但就像流星开箱即用一样将单个节点作为副本集本身没有任何问题.在生产中这样做是不明智的.
这比简单的答案更为广泛,但基本概念是因为“oplog”是一个上限集合,您可以为数据库上的所有写操作“拖尾”它.然后检查此事件数据以确定已写入要监视写入的集合的详细信息.然后,该数据可用于查询新信息,并通过websocket或类似方式将更新或新结果返回给客户端.
但是流本身就只是一个流.要“跟踪”集合上的更改,您需要将其实现为上限,或者考虑基于如上所述观察oplog中的更改来实现流程.