MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Melhor maneira de consultar todos os documentos de uma coleção mongodb de maneira reativa sem inundação de RAM


Não sou especialista em mongodb, mas com base nos exemplos que vi, esse é um padrão que eu tentaria.

Eu omiti os outros eventos além dos dados, já que estrangular aquele parece ser a principal preocupação.
var cursor = db.collection('mycollection').find({});  

const cursorNext = new Rx.BehaviourSubject('next');  // signal first batch then wait
const nextBatch = () => {
  if(cursor.hasNext()) {
    cursorNext.next('next');
  }
});

cursorNext
  .switchMap(() =>                            // wait for cursorNext to signal
     Rx.Observable.fromPromise(cursor.next())  // get a single doc
       .repeat()                               // get another
       .takeWhile(() => cursor.hasNext() )     // stop taking if out of data
       .take(batchSize)                        // until full batch
       .toArray()                              // combine into a single emit
  )
  .map(docsBatch => {
    // do something with the batch
    // return docsBatch or modified doscBatch
  })
  ... // other operators?
  .subscribe(x => {
    ...
    nextBatch();
  });         

Estou tentando montar um teste desse fluxo Rx sem mongodb, enquanto isso isso pode te dar algumas ideias.