MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Il modo migliore per interrogare tutti i documenti da una raccolta mongodb in modo reattivo senza inondare la RAM

Non sono un esperto di mongodb, ma sulla base degli esempi che ho visto, questo è uno schema che proverei.

Ho omesso gli eventi diversi dai dati, poiché la limitazione di quello sembra essere la preoccupazione principale.

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();
  });         

Sto cercando di mettere insieme un test di questo flusso Rx senza mongodb, nel frattempo questo potrebbe darti qualche idea.