Cursores disponíveis no MongoDB

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!