Isso levou mais ou menos uma hora pesquisando no Google e lendo a fonte do driver do Node para descobrir, então estou colocando-o aqui para evitar que os outros sofram.
Há um recurso interessante do MongoDB em que você pode manter um cursor aberto na coleção limitada e aguardando os dados durante o tempo de vida do aplicativo. É especialmente útil para criar um sistema PubSub simples sem adicionar uma dependência ao Redis.
Primeiro você precisa configurar a coleção limitada:
db.createCollection('messages', {capped: true, size: 100000})
O campo “tamanho” é o tamanho máximo da coleção em bytes. O valor acima é 100 KB, o que é mais do que suficiente para o sistema pubsub (provavelmente muito!)
Então, para obter mensagens dessa coleção quando forem inseridas:
function listen(conditions, callback) {
coll = db.collection('messages')
latestCursor = coll.find(conditions).sort({$natural: -1}).limit(1)
latestCursor.nextObject(function(err, latest) {
if (latest) {
conditions._id = {$gt: latest._id}
}
options = {
tailable: true,
await_data: true,
numberOfRetries: -1
}
stream = coll.find(conditions, options).sort({$natural: -1}).stream()
stream.on('data', callback)
})
}
O resumo é o seguinte:
1. obtenha o documento mais recente e adicione seu ID às condições
2. crie um cursor que está disponível, aguarda dados e sempre tenta novamente
3. continue chamando cursor.nextObject, passando os resultados para o retorno de chamada
A principal coisa que não ficou clara em outro lugar é a opção await_data , já que geralmente é escrita awaitdata .
Espero que isso ajude alguém!