我想遍历每个学生,然后执行两个查询,这两个查询的执行应同步,首先是第一个,然后是第二个查询,因为这取决于第一个。
我已经写了一些代码,但似乎根本不起作用:
Student.find({ status: 'student' })
.populate('student')
.exec(function (err, students) {
if (err) {
return res.status(400).send({
message: errorHandler.getErrorMessage(err)
});
}
_.forEach(students, function (student) {
async.waterfall(
[
function (callback) {
console.log('first ' + student.firstName);
Student.find({ "_id": student.id }, callback);
},
function (student, callback) {
console.log('second '+ student[0].firstName);
WorksnapsTimeEntry.find({
"student": {
"$in": student.map(function (el) {
return el._id
})
}
}, callback);
}
],
function (err, results) {
if (err) {
// do something
} else {
// results are the matching entries
console.log('third');
var totalMinutes = 0;
var totalAvgLevelActivity = 0;
var counter = 0;
_.forEach(results, function (item) {
_.forEach(item.timeEntries, function (item) {
if (item.duration_in_minutes) {
totalMinutes = totalMinutes + parseFloat(item.duration_in_minutes[0]);
}
if (item.activity_level) {
totalAvgLevelActivity = totalAvgLevelActivity + parseFloat(item.activity_level[0]);
counter++;
}
});
});
var obj = {};
obj.studentId = 'test';
obj.firstName = 'test';
obj.lastName = 'test';
obj.municipality = 'test';
obj.totalMinutes = totalMinutes;
obj.totalAvgLevelActivity = totalAvgLevelActivity / counter;
arrayReports.push(obj);
// console.log('not yet finished.');
}
}
);
});
res.json(arrayReports);
console.log('finished.');
任何人都知道如何在Node.js中实现此目标
mongoose
承诺,您无需使用async
简单的forEach就可以处理流程或lodash了。并且通过_id请求查找是无用的,您已经有一个Student
对象:
Student.find({ status: 'student' })
// .populate('student') // why this?
.then(function (students) {
// build an array of promises
var promises = students.map(function (student) {
return WorksnapsTimeEntry.find({
"student": student._id;
});
});
// return a promise to continue the chain
return Promise.all(promises);
}).then(function(results) {
// results are the matching entries
console.log('third');
var totalMinutes = 0;
var totalAvgLevelActivity = 0;
var counter = 0;
_.forEach(results, function (item) {
_.forEach(item.timeEntries, function (item) {
if (item.duration_in_minutes) {
totalMinutes = totalMinutes + parseFloat(item.duration_in_minutes[0]);
}
if (item.activity_level) {
totalAvgLevelActivity = totalAvgLevelActivity + parseFloat(item.activity_level[0]);
counter++;
}
});
});
var obj = {};
obj.studentId = 'test';
obj.firstName = 'test';
obj.lastName = 'test';
obj.municipality = 'test';
obj.totalMinutes = totalMinutes;
obj.totalAvgLevelActivity = totalAvgLevelActivity / counter;
arrayReports.push(obj);
// console.log('not yet finished.');
res.json(arrayReports);
console.log('finished.');
}).catch(function(err) {
return res.status(400).send({
message: errorHandler.getErrorMessage(err)
});
});
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句