Mongoose QueryStream新结果

时间:2013-08-01 06:26:52

标签: node.js mongodb streaming mongoose

当我将另一个应用程序将新文档插入到集合中时,我正在尝试设置MongooseJS来推出整个集合(或者只是最新的项目)。

我认为QueryStream是要走的路。

然而,当我启动我的简单应用程序时,它会读出一次该集合,并将其关闭。

当我插入新文档时没有任何反应(假设连接不再打开并寻找新结果......?)

var Orders = db.model('orders', OrderSchema);

var stream = Orders.find().stream();

stream.on('data', function(doc){
    console.log('New item!');
    console.log(doc);
}).on('error', function (error){
    console.log(error);
}).on('close', function () {
    console.log('closed');
});

立即打印当前在订单集合中的所有项目,然后打印“已关闭”。当集合更改时,“流”是否应该保持打开状态打印新数据?

我不了解MongooseJS QueryStream

聚苯乙烯。我的目标是通过emit最终socket.io更新集合,如下所示:Mongoose stream return few results first time

2 个答案:

答案 0 :(得分:5)

我发现为了使这个方法有效,我需要将我的集合更改为capped collection

var OrderSchema = new Mongoose.Schema({...
}, { capped: { size: 10, max: 10, autoIndexId: true }});

var Orders = db.model('orders', OrderSchema);

var stream = Orders.find().tailable().stream();

stream.on('data', function(doc){
    console.log('New item!');
    console.log(doc);
}).on('error', function (error){
    console.log(error);
}).on('close', function () {
    console.log('closed');
});

这是有效的,因为我现在可以将MongoDB collection视为一个不断更新的消息队列。

奇怪的是,当我把它包裹在SocketIO事件中时,我得到同一个documents的倍数,这让我觉得还有一些我做得不对的......

答案 1 :(得分:4)

每次开始流式传输时,您都需要一些标记(时间戳或只是一个普通数字)才能获得所有集合。例如,如果在集合条目中插入时间戳,则可以使用:

    var filter = { "timestamp":{"$gte":Date.now()}};
    var stream = Orders.find(filter).tailable().stream();

在bash中将mongoDB流式传输视为tail -f命令。