当我将另一个应用程序将新文档插入到集合中时,我正在尝试设置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
答案 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
命令。