将MongoJS选择结果保存到NodeJS中的数组,然后进行修改

时间:2018-01-23 10:20:34

标签: node.js mongodb mongojs

很难在NodeJS中保存和修改MongoJS查询的结果。

router.post('/getMySubjects', function (req, res) {
    var data = [];
    if (req.body.type == 'Professor') {
        db.subjects.find({ contractorID: req.body.userId }, function (err, subjects) {

            data = subjects;                    // SUBJECTS ARE NOW SAVED TO DATA SUCCESSFULLY

            data.forEach(function(subject) {
                db.faculties.find({ _id: mongojs.ObjectID(subject.subjectFor_faculty)}, function (err, faculty) {
                    subject.faculty = faculty;  // BUT HERE I WANT TO ADD A FACULTY (object)
                                                // BASED ON THE subjectFor_faculty (id) 
                                                // WHICH IS LOCATED IN EVERY (subject)
                                                // ELEMENT IN DATA ARRAY
                });
            });
            res.send(data);                     // THE DATA HERE IS UNMODIFIED
                                                // SAME AS DATA ON LINE 6 
        }); 
    }
});

我认为我还没有完全理解响应是如何工作的(顺便说一下应用程序是用快速框架制作的),因为当数据首次保存在第6行时,下一步是发送数据,只有那么应用程序进入forEach循环......

1 个答案:

答案 0 :(得分:0)

您正在制作异步mongo查询。你必须让它们同步才能获得正确的数据。这是使用promises的实现。

router.post('/getMySubjects', function (req, res) {
var data = [];
if (req.body.type == 'Professor') {
    db.subjects.find({ contractorID: req.body.userId }, function (err, subjects) {
        data = subjects;
        var promises = [];
        data.forEach(function(subject) {
          var promise = new Promise(function(resolve, reject) {
            db.faculties.find({ _id: mongojs.ObjectID(subject.subjectFor_faculty)}, function (err, faculty) {
                resolve(faculty);
            });
          });
          promises.push(promise);
       });
        Promise.all(promises).then(function(values){ 
           for(var i = 0; i< values.length;i++){
            data[i].faculty = values[i];               
           }
           res.send(data);
        });                  
    }); 
  } 
});