如何迭代Model.stream水线查询的每条记录?

时间:2015-07-29 02:42:17

标签: node.js mongodb sails.js waterline

我需要做类似的事情:

Lineup.stream({foo:"bar"}).exec(function(err,lineup){

  // Do something with each record
});

阵容是一个拥有超过18000条记录的集合,因此我认为使用find不是一个好选择。这样做的正确方法是什么?从文档我无法弄清楚如何。

1 个答案:

答案 0 :(得分:5)

.stream()方法返回node stream interface(读取流),在读取数据时发出事件。您在此处的选项要么是.pipe()要么可以采用“流”输入的其他内容,例如服务器的响应对象,要么将event listener附加到从流发出的事件中。即:

管道响应

Lineup.stream({foo:"bar"}).pipe(res);

设置事件监听器

var stream = Lineup.stream({foo:"bar"});

stream.on("data",function(data) {
    stream.pause();        // stop emitting events for a moment
    /*
     * Do things
     */
    stream.resume();       // resume events
});

stream.on("err",function(err) {
    // handle any errors that will throw in reading here
});

.pause().resume()非常重要,因为处理过程中的内容只是在代码完成之前对发出的事件做出响应。虽然对于小型情况很好,但对于接口用于的较大“流”来说这是不可取的。

此外,如果您在这样的事件处理程序中调用任何“异步”操作,那么您需要在回调或承诺解析中注意.resume(),从而等待“异步”操作完成本身。

但请查看前面链接的“节点文档”,以获取有关“流”的更深入信息。

P.S我相信如果它更适合你的敏感度,也应该支持以下语法:

 var stream = Lineup.find({foo:"bar"}).stream();