【问题标题】:Mongoose QueryStream new resultsMongoose QueryStream 新结果
【发布时间】:2013-08-01 06:26:51
【问题描述】:

我正在尝试设置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 集合中的所有项目,然后打印“已关闭”。当集合更改时,“流”不应该保持打开打印新数据吗?

我对@9​​87654325@ 有什么不明白的地方?

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

【问题讨论】:

    标签: node.js mongodb streaming mongoose


    【解决方案1】:

    我发现为了让这种方法起作用,我需要将我的收藏更改为 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 的倍数,这让我觉得还有一些事情我做得不完全正确......

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 谢谢,我会试试看我是否得到多个结果或是否有帮助
      猜你喜欢
      • 1970-01-01
      • 2015-10-22
      • 2015-06-15
      • 1970-01-01
      • 1970-01-01
      • 2018-11-08
      • 2020-04-08
      • 2021-02-12
      • 1970-01-01
      相关资源
      最近更新 更多