2016-09-04 5 views
0
MongoClient.connect('mongodb://127.0.0.1:27017/manufacturers', 
    function(err, db) { 
    db.listCollections().toArray(function(err, collections) { 
     for (var key in collections) { // iterate over all collections 
     var manufacturer = collections[key]['name']; 
     var query = {}; // and get all documents 
     findDocuments(db, manufacturer, query, processData); 
     } 
    }); 
    }); 

var findDocuments = function(db, collection, queryObj, callback) { 
    var cursor = db.collection(collection).find(queryObj); 
    cursor.each(function(err, docs) { 
    if (docs != null) { console.log(docs); } 
    }); 
} 

.. es funktioniert, sondern nur Daten aus einer der Sammlungen, nicht alle erhalten.Synchron für Schleife

Es scheint, dass for Schleife endet sofort, wie kann ich warten, bis die Zwischenfunktionen zurückgegeben werden?

+0

'findDocuments' setzt' collection' immer auf 'supplier', vielleicht einen Tippfehler von' Hersteller'? –

+0

@chernando Sorry, Tippfehler. Es funktioniert mit Sicherheit, nur diese Schleife wartet nicht auf die Rückkehr der 'findDocuments'. – 3zzy

Antwort

1

Für Schleifen, die synchron laufen, benötigen Sie eine Funktion. Ich habe eine Beispieldatenbank mit der folgenden Struktur,

manufacturers (db) 
    man1 (collection 1) 
    man1doc1 
    man1doc2 
    man2 (collection 2) 
    man2doc1 

und lief den folgenden Code alle Dokumente in allen Sammlungen der Reihe nach drucken, einer Sammlung zu einem Zeitpunkt.

var MongoClient = require('mongodb').MongoClient; 

MongoClient.connect('mongodb://127.0.0.1:27017/manufacturers', 
function(err, db) { 
db.listCollections().toArray(function(err, collections) { 

    if(!collections.length){ 
    console.log('No collections found'); 
    return; 
    } 

    function sequentialIterate(key){ 
    if(key === collections.length){ 
     console.log('All documents in all collections printed'); 
     return; 
    } 
    var manufacturer = collections[key]['name']; 
    var query = {}; 

    db.collection(manufacturer).find(query, function(err, cursor){ 
     cursor.each(function(err, doc){ 
     if(doc){ 
      console.log(doc); 
     } 
     else{ 
      console.log('All documents in collection ' + manufacturer + ' printed'); 
      sequentialIterate(key + 1); 
     } 
     }); 
    });  
    }; 

    sequentialIterate(0); // kick things off 

}); 
}); 

Druckt die folgenden:

{ _id: 57cc44fc03b65f4084865057, name: 'man2doc1' } 
All documents in collection man2 printed 
{ _id: 57cc44f003b65f4084865055, name: 'man1doc1' } 
{ _id: 57cc44f303b65f4084865056, name: 'man1doc2' } 
All documents in collection man1 printed 
All documents in all collections printed 

Sie können die console.log() mit Rückrufe ersetzen, wenn Sie wollen.

+0

Ah danke, schönes Beispiel! – 3zzy