Использование нескольких FindOne в Mongodb - PullRequest
0 голосов
/ 06 марта 2019

Я пытаюсь увеличить количество полей, которые возвращает наш API.Прямо сейчас API возвращает информацию об ученике, используя find, а также добавляет некоторую информацию о проектах, получая информацию об ученике и используя findOne, чтобы получить информацию о проекте, в котором студент в данный момент зарегистрирован.

Я пытаюсь добавить некоторую информацию о курсе, используя ту же логику, которую я использовал для получения информации о проекте.

Поэтому я использовал ту же функцию findOne, которую использовал для проектов, и моя логика заключается в следующем.

Я создал переменную, в которой я могу сохранить courseID, а затем помещу содержимое этой переменной во временный объект, отправляемый в файл json.

Если я закомментирую то, что я добавил, код работает отлично, и он возвращает всех студентов, которые мне нужны.Однако, когда я делаю дополнительный findOne для получения информации о курсе, он перестает возвращать что-либо, кроме "{}"

Я собираюсь добавить комментарий к добавленным строкам кода, чтобы упростить его.найти.

Любая помощь будет высоко оценена!

User.find({
    isEnrolled: true,
    course: {
      $ne: null
    }
  },
  'email pantherID firstName lastName project course',
  function(err, users) {
    console.log("err, users", err, users);
    if (err) {
      return res.send(err);
    } else if (users) {
      var userPromises = [];
      users.map(function(user) {
        userPromises.push(new Promise(function(resolve, reject) {

          ///////// Added Code  START///////
          var courseID;

          Course.findOne({
              fullName: user.course
            }, function(err, course) {
              console.log("err, course", err, course);
              if (err) {
                reject('')
              }

              courseID = course ? course._id : null


              //console.log(tempObj)
              resolve(tempObj)
            }),

            ///// ADDED CODE END //////

            Project.findOne({
              title: user.project
            }, function(err, proj) {
              console.log("err, proj", err, proj);
              if (err) {
                reject('')
              }
              //Course ID, Semester, Semester ID
              //map to custom object for MJ
              var tempObj = {
                email: user.email,
                id: user.pantherID,
                firstName: user.firstName,
                lastName: user.lastName,
                middle: null,
                valid: true,
                projectTitle: user.project,
                projectId: proj ? proj._id : null,
                course: user.course,
                courseId: courseID
              }

              //console.log(tempObj)
              resolve(tempObj)
            })
        }))
      })
      //async wait and set
      Promise.all(userPromises).then(function(results) {
        res.json(results)
      }).catch(function(err) {
        res.send(err)
      })
    }
  })

1 Ответ

0 голосов
/ 06 марта 2019

использование обещания может быть немного утомительным, попробуйте использовать async , вот как я бы это сделал.

// Make sure User, Course & Project models are required. 

const async = require('async');

let getUsers = (cb) => {
    Users.find({
        isEnrolled: true,
        course: {
            $ne: null
        }
    }, 'email pantherID firstName lastName project course', (err, users) => {
        if (!err) {
            cb(null, users);
        } else {
            cb(err);    
        }
    });
};

let findCourse = (users, cb) => {
    async.each(users, (user, ecb) => {
        Project.findOne({title: user.project})
            .exec((err, project) => {
                if (!err) {
                    users[users.indexOf(user)].projectId = project._id;
                    ecb();     
                } else {
                    ecb(err);
                }
            });
    }, (err) => {
        if (!err) {
            cb(null, users);
        } else {
            cb(err);
        }
    });
};

let findProject = (users, cb) => {
    async.each(users, (user, ecb) => {
        Course.findOne({fullName: user.course})
            .exec((err, course) => {
                if (!err) {
                    users[users.indexOf(user)].courseId = course._id;
                    ecb();     
                } else {
                    ecb(err);
                }
            });
    }, (err) => {
        if (!err) {
            cb(null, users);
        } else {
            cb(err);
        }
    });
};

// This part of the code belongs at the route scope
async.waterfall([
    getUsers,
    findCourse,
    findProject
], (err, result) => {
    if (!err) {
        res.send(result);
    } else {
        return res.send(err);        
    }
});

Надеюсь, это поможет лучше понять, как можно выполнить несколько транзакций ввода-вывода для одного и того же запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...