2

当另一个应用程序将新文档插入集合中时,我正在尝试设置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');
});

立即打印当前在orders 集合中的所有项目,然后打印“已关闭”。当集合发生变化时,“流”不应该保持打开打印新数据吗?

我不明白什么MongooseJS QueryStream

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

4

2 回答 2

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这让我觉得还有一些事情我做的不完全正确......

于 2013-08-04T17:08:29.053 回答
4

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

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

将 mongoDB 流视为tail -fbash 中的命令。

于 2013-09-12T11:43:44.057 回答