Mongoose QueryStream новые результаты

Я пытаюсь настроить 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?

Ps. моя цель в конечном итоге emit обновленная коллекция через socket.io как показано здесь: поток Mongoose впервые дает несколько результатов

2 ответа

Решение

Я обнаружил, что для того, чтобы этот метод работал, мне нужно было изменить свою коллекцию на 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 что заставляет меня думать, что есть еще что-то, что я делаю не совсем правильно...

Вам нужна некоторая отметка (временная метка или просто число), чтобы не получать всю коллекцию каждый раз, когда вы начинаете потоковую передачу. Например, если вы вставите отметку времени в записи коллекции, вы можете использовать:

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

Подумайте о потоковой трансляции mongoDB как о tail -f команда в баш.

Другие вопросы по тегам