Mongodb: как создать представление `tail -f` для закрытой коллекции?
Я хотел бы создать своего рода "приборную панель" на capped
коллекция (которая используется в качестве таблицы журнала) в моей базе данных Mongo. Вот как я создаю коллекцию:
db.createCollection( "messages", { capped: true, size: 100000 } );
Я делаю collection.find()
с вариантами tailable:true
, awaitdata:true
, а также numberOfRetries:-1
(бесконечные повторы).
Меня озадачивает то, что я ожидаю, что цикл find (). Each () будет ожидать новых данных (сообщений)... вместо этого (через несколько секунд) он выдаст ошибку (с 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);
}
}
})
});
});
Что мне не хватает?
ОБНОВЛЕНИЕ:
Не получив никакого окончательного ответа до сих пор, я делаю вывод MongoDb tailable collections
не готов в прайм-тайм...:-(((
К сожалению, отказываясь от более классического и надежного решения для ведения журнала fs...
2 ответа
Вы можете настроить функцию подписчика, которая подписывается на новые документы MongoDB, используя настраиваемые find()
курсор в виде потока node.js Следующее демонстрирует это:
// 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);
});
Источник: Как подписаться на новые документы MongoDB в Node.js, используя настраиваемый курсор
Может быть, кто-то также ищет решение с открытым монго-терминалом (я имею в виду, без живого прослушивания на любом языке программирования). Если вы хотите хотя бы раз взглянуть на конец коллекции, подумайте об использовании этого
db.oplog.rs.find().sort({$natural: -1})
Надеюсь, я кому-то помог :)