mongoDB + nodeJS: не может держать курсор потока открытым

Для просмотра журнала мне нужно записывать обновления в коллекцию mongoDB на сокете sockJS.

Основываясь на этом сообщении, я использую курсор потока собственного драйвера nodeJS для этого, но он работает только для контента, присутствующего в коллекции, когда я создаю поток. Ни одно из дальнейших обновлений не пишется.

Вот мой код:

var server = new mongodb.Server(config.db_host, config.db_port, {});
var DB = new mongodb.Db('myLogs', server, {w:0}).open(function (error, database) {
    if (error) throw error;
    db.logs = database.collection('logs');
});

var stream = db.logs.find({user: sID}, {sort: [['_id', 'asc']]}).stream();

stream.on('error', function (err) {
    socket.write(JSON.stringify({'action': 'log','param': 'log db streaming error'}));
});
stream.on('data', function (doc) {
    socket.write(JSON.stringify({'action': 'log','param': doc.log}));
});

Что я делаю не так? Может ли это работать?


person Axel Cateland    schedule 06.03.2013    source источник


Ответы (1)


Если у вас есть ограниченная коллекция, вы можете использовать TailableCursor, который делает то, что вы хотите. Стандартный CursorStream возвращает только те результаты, которые совпали на момент вызова find (как вы видели).

Однако в Node.JS не так много информации для этого. Вот указатель в правильном направлении.

Хотя я не тестировал этот код, он должен быть примерно таким, как показано ниже. Ключ использует ограниченную коллекцию и устанавливает для параметров tailable и awaitdata значение true.

var stream = db.logs.find({user: sID}, {
    tailable: true,
    awaitdata: true 
    /* other options */
}).stream();

stream.on('data', function (doc) {
    socket.write(JSON.stringify({'action': 'log','param': doc.log}));
});
person WiredPrairie    schedule 06.03.2013
comment
Я думаю, вы также захотите включить опцию awaitdata: true. - person JohnnyHK; 07.03.2013
comment
Большое спасибо за это. Я попробовал и внес это изменение, а также изменил создание коллекции на db.logs = database.collection('logs', {'capped':true, 'size':10000});. Я сбросил старую коллекцию, прежде чем начать чистку. Но я получаю сообщение об ошибке, говорящее мне, что я могу создать хвостовой курсор только для ограниченной коллекции. Должен ли я сделать что-то еще, чтобы ограничить мою коллекцию? - person Axel Cateland; 07.03.2013
comment
Решено: мне пришлось создать коллекцию с помощью команды оболочки MongoDB. Эквивалентная функция nodeJS не ограничивает ее. Я добавлю небольшое замечание к вашему ответу и приму его. Большое спасибо. - person Axel Cateland; 07.03.2013