Как я могу изменить полученный запрос в Mon goose, не затрагивая фактический документ? - PullRequest
1 голос
/ 03 мая 2020

Статус (по состоянию на 5/6/2020): Решено, см. Определенный ответ ниже.

Я надеюсь, что все хорошо, несмотря на глобальный кризис, который мы переживают прямо сейчас. В настоящее время я занимаюсь школьным веб-проектом, и мне нужно отрисовать назначенную мне особенность c. Я использую Пн goose с Express и Handlebars для шаблонов. См. Прилагаемую схему и пояснения к модели ниже.

CollegeModel - Коллекция A

var collegeSchema = new Schema({
    shortName: {type: String},  //value that I intend to synchronously query its occurrence with Collection B
    longName: {type: String},
    logo: {type: String},
    contactUs:{
        telNum: {type: String},
        faxNum: {type: String},
        email: {type: String}
    },
    aboutUs: {type: Array},
    visionMission: {type: String},
    coreValues: {type: String},
    goals: {type: String},
    founderBio: {type: String},
    philosophy: {type: String},
    icon: {type: String}
});

ProfessorModel - Коллекция B

var professorSchema = new Schema({
    profNumber: {type: Int32},
    college: {type: String},    //value to be compared with shortName
    gender: {type: String},
    profName: {type: String},
    profCourse: {type: String}
});

Псевдокод - Желаемая логика c должна быть достигнута

app.get('/testCount', function(req,res) {
    collegeModel.find({}).lean().exec(function(err,collegeRes){
        var collegeObject = [];
        collegeRes.forEach(function(document){
            professorModel.countDocuments({college:document.shortName}, function(err2,professorCount){
                document.count = professorCount;
                collegeObject.push(document);   //doing a console.log(collegeObject) would return empty objects [].
            });
        });
    });
});

Я не знаю, что я делаю неправильно, и я знаю, что document.count существует, поскольку он возвращает значение каждый раз, когда я делаю console.log (document.count), но когда оно выдвигается, оно становится []. Надеюсь, ты сможешь помочь мне достичь моей цели. Спасибо!

1 Ответ

1 голос
/ 04 мая 2020

Ваши запросы разрешаются асинхронно, вам нужно найти способ дождаться завершения всех из них, чтобы убедиться, что у вас есть все необходимые данные.

Один из способов решить эту проблему - использовать async/await (Node.js> = 7.6.0)

app.get('/testCount', async function(req, res) { // note the async keyword
  const collegeRes = await collegeModel.find({}).lean().exec() // .exec() returns a Promise, so you can `await` it.
  const resultPromises = collegeRes.map(async college => { // arrow function is equivalent to function in this context
    const professorCount = await professorModel.countDocuments({ college: college.shortName })
    college.count = professorCount
    return college
  })
  const collegeObject = await Promise.all(resultPromises)
  console.log(collegeObject)
})

Чуть более читабельным будет использование Promise.map из bluebird или вы также можете использовать другие служебная библиотека обещаний

  const collegeObject = await Promise.map(collegeRes, college => {
    const professorCount = await professorModel.countDocuments({ college: college.shortName })
    college.count = professorCount
    return college
  })
  console.log(collegeObject)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...