Mongodb:如何在封顶集合上创建`tail -f`视图?

时间:2015-10-12 13:01:26

标签: javascript node.js mongodb capped-collections

我想创建一种'仪表板'在我的Mongo数据库上的capped集合(用作日志表)上。 这就是我创建集合的方式:

db.createCollection( "messages", { capped: true, size: 100000 } );

我使用选项collection.find()tailable:trueawaitdata:true(无限重试)进行numberOfRetries:-1

让我感到困惑的是,我希望find()。each()循环等待新数据(消息)......而不是(几秒钟后)它出错(使用{{1} } ...: - ()

这是我正在使用的代码:

No more documents in tailed cursor

我想念什么?

更新

直到现在还没有收到任何确凿的答案,我推断var mongo = require('mongodb'); mongo.MongoClient.connect('mongodb://127.0.0.1/myDb', function (err, db) { db.collection('messages', function(err, collection) { if (err) { return console.error('error in status collection:', err); } collection.find( // open tailable cursor {}, { tailable: true, awaitdata: true, numberOfRetries: -1 } ).each(function(err, doc) { if (err) { if (err.message === 'No more documents in tailed cursor') { console.log('finished!'); } else { console.error('error in messages collection:', err); } } else { if (doc) { console.log('message:', doc.message); } } }) }); }); 尚未准备好迎接黄金时段......: - ((

遗憾地放弃了更经典,更强大的fs记录解决方案......

2 个答案:

答案 0 :(得分:1)

您可以使用可用的 find() 光标作为 node.js stream 设置订阅新MongoDB文档的订阅者功能。以下内容证明了这一点:

// subscriber function
var subscribe = function(){

    var args = [].slice.call(arguments);
    var next = args.pop();
    var filter = args.shift() || {};

    if('function' !== typeof next) throw('Callback function not defined');

    var mongo = require('mongodb');  
    mongo.MongoClient.connect('mongodb://127.0.0.1/myDb', function(err, db){

        db.collection('messages', function(err, collection) {           
            var seekCursor = collection.find(filter).sort({$natural: -1}).limit(1);
            seekCursor.nextObject(function(err, latest) {
                if (latest) {
                    filter._id = { $gt: latest._id }
                }           

                var cursorOptions = {
                    tailable: true,
                    awaitdata: true,
                    numberOfRetries: -1
                };

                var stream = collection.find(filter, cursorOptions).sort({$natural: -1}).stream();
                stream.on('data', next);
            });
        });
    });

};

// subscribe to new messages
subscribe( function(document) {
    console.log(document);  
});

来源How to subscribe for new MongoDB documents in Node.js using tailable cursor

答案 1 :(得分:0)

也许有人也在寻找裸 mongo 终端解决方案(我的意思是,没有现场收听任何编程语言)。如果你只想看一次集合的结尾,可以考虑使用这个

db.oplog.rs.find().sort({$natural: -1})

希望我对某人有所帮助:)