Я недавно начал использовать 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"
}
]
Попробуйте поместить 'eachField._id' непосредственно в ваш запрос на поиск вместо' eachField._id.valueOf() '. Запрос будет соответствовать только, если вы дадите ему реальный экземпляр ObjectId. –
Это не сработает, потому что fieldId сохраняется как строковое значение, а не ObjectId. – maddyeng
Я попробовал ваше предложение и все равно не повезло – maddyeng