2014-11-06 6 views
1

Я недавно начал использовать async api. Теперь мое требование состоит в том, чтобы выполнить объединение по 3 коллекциям , а именно поля, скрипты и утверждения. поля могут иметь несколько сценариев, а скрипты могут иметь несколько операторов.async.each вложен в async.waterfall

вот что я пытался до сих пор: (присоединиться к коллекции Fields с помощью скриптов)

// Array to hold async tasks 
var asyncTasks = []; 

async.waterfall([ 
    function(callback){ 
     // fetches fields based on some Id and it returns 2 fields 
     db.fields.find({entity_id: mongojs.ObjectId("54440a448bbbcbb4070131ab")}, function (err, fields) { 
      console.log(JSON.stringify(fields, null, 2)); 
      callback(null, fields); 
     }) 
    }, 
    function(arg1, callback){ 
     // arg1 now equals fields   
     arg1.forEach(function(eachField){ 
      asyncTasks.push(function(callback){ 
       db.scripts.find({fieldId: eachField._id.valueOf()}, function(err, scripts) { 
        // Async call is done then alert via callback 
        console.log(JSON.stringify(scripts, null, 2)); 
        callback(null, scripts); 
       }); 
      }); 
     }); 


     // Now we have an array of functions doing async tasks 
     // Execute all async tasks in the asyncTasks array 
     async.parallel(asyncTasks, function(err, results) { 
      // All tasks are done now 
      console.log("Scripts" + JSON.stringify(results, null, 2)); 
      callback(null, "done"); 
     }); 

    } 
], function (err, result) { 
     console.log(result); 
}); 

// for the above code here is what i get the output 
[ 
    { 
    "_id": "54440a548bbbcbb4070131ac", 
    "name": "t1", 
    "type": "String", 
    "entity_id": "54440a448bbbcbb4070131ab" 
    }, 
    { 
    "_id": "54447f1d20c103981fa1a27c", 
    "name": "t2", 
    "type": "String", 
    "entity_id": "54440a448bbbcbb4070131ab" 
    } 
] 
size of array 2 
[] 
[] 
Scripts[ 
    [], 
    [] 
] 
done 

выше выход не печатает никаких сценариев, даже если есть 2 скрипта в базе данных. Моя база данных находится в MongoDB, и я использую NodeJs, MongoJS api. почему db.scripts.find() возвращает пустой массив? Любая помощь с благодарностью

Я проверил этот кусок кода, чтобы увидеть, возвращаются ли скрипты o/p. Здесь Вы можете найти свой код

test2(); 
    function test2(){ 

     var getScriptFunction = function(eachField, doneCallback){ 
      if(eachField !== undefined) { 
       var fieldId = eachField; 
       console.log(fieldId); 
       db.scripts.find({fieldId: fieldId}, function (err, result) { 
        // Async call is done, alert via callback 
        doneCallback(null, result); 
       }); 
      } 
     } 
     // The array is the id of fields 
     async.map(["54440a548bbbcbb4070131ac", "54447f1d20c103981fa1a27c"], getScriptFunction, function (err, results) { 
      // Square has been called on each of the numbers 
      // so we're now done! 
      if (err){ 
       console.log("error!" + err); 
      } else { 
       console.log("printed from helper function \n" + JSON.stringify(results, null, 2)); 
      } 
     }); 
    } 

Это о/р от приведенного выше кода для выборки сценариев побежал индивидуально

printed from helper function 
[ 
    [ 
    { 
     "_id": "54440a678bbbcbb4070131ad", 
     "name": "s1", 
     "fieldId": "54440a548bbbcbb4070131ac" 
    }, 
    { 
     "_id": "544af260eb7a486824a5c306", 
     "name": "s2", 
     "fieldId": "54440a548bbbcbb4070131ac" 
    } 
    ], 
    [] 
] 

Это как поля выглядеть (db.fields .find(). pretty())

[ 
    { 
    "_id": "54440a548bbbcbb4070131ac", 
    "name": "t1", 
    "type": "String", 
    "entity_id": "54440a448bbbcbb4070131ab" 
    }, 
    { 
    "_id": "54447f1d20c103981fa1a27c", 
    "name": "t2", 
    "type": "String", 
    "entity_id": "54440a448bbbcbb4070131ab" 
    } 
] 
+0

Попробуйте поместить 'eachField._id' непосредственно в ваш запрос на поиск вместо' eachField._id.valueOf() '. Запрос будет соответствовать только, если вы дадите ему реальный экземпляр ObjectId. –

+0

Это не сработает, потому что fieldId сохраняется как строковое значение, а не ObjectId. – maddyeng

+0

Я попробовал ваше предложение и все равно не повезло – maddyeng

ответ

1

Я смог решить проблему проблема. было 2 проблемы (1) у меня было одно имя для функций обратного вызова, т. е. внутренний и внешний обратный вызов вложены друг в друга. (2) Мне пришлось использовать toString(), а не valueOf()

Смежные вопросы