Мангуст, как найти все данные из объекта? - PullRequest
0 голосов
/ 13 февраля 2019

Просто я хочу найти все данные, которые имеют одинаковый идентификатор объекта, но не работают

   app.get("/admin/phase/:level", function(req,res){

            Level.findOne({_id: req.params.level},function(err,onelevel){
            console.log(onelevel._id)
            Semster.find({level: onelevel._id},function(err,semster){

                    Module.find({semster: semster._id } , function(err , modules){
                    console.log(semster)
                        res.render("semster",{onelevels: onelevel, semsters: semster, modules: modules})})})})});

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Мы решаем эту проблему, используя MongoDB Aggregate или используя цикл с async / await .Мне нравится, что вы предпочитаете использовать MongoDB в качестве предпочтительного и оптимального метода для этого.

Использование JavaScript:

app.get("/admin/phase/:level", async function (req, res) {

    Level.findOne({ _id: req.params.level }, function (err, onelevel) {
        Semster.find({ level: onelevel._id }, function (err, semsters) {
            const modulePromise = semsters.map(semster => Module.find({ semster: semster._id }));
            var modules = await Promise.all(modulePromise);
            res.render("semster", { onelevels: onelevel, semsters: semsters, modules: modules })
        })
    })
});

Обновлено:

app.get("/admin/phase/:level", async function (req, res) {
    try {
        const onelevel = await Level.findOne({ _id: req.params.level });
        const semsters = await Semster.find({ level: onelevel._id });
        const modulePromise = semsters.map(semster => Module.find({ semster: semster._id }));
        var modules = await Promise.all(modulePromise);
        res.render("semster", { onelevels: onelevel, semsters: semsters, modules: modules })
    } catch (err) {
        //Your Error Handler
    }
});

Использование агрегата Монго:

app.get("/admin/phase/:level", function (req, res) {
    Level.findOne({ _id: req.params.level }, function (err, onelevel) {
        Semster.aggregate([
            { $match: { level: onelevel._id } },
            { $lookup: { from: "module", localField: "_id", foreignField: "semster", as: "module" } }
        ], function (err, semsters) {
            res.render("semster", { onelevels: onelevel, semsters: semsters})
        })
    })
});
0 голосов
/ 13 февраля 2019

Я бы рекомендовал использовать async и await для запросов к базе данных, чтобы у mongoose было достаточно времени для поиска документа.При этом я бы использовал блоки try-catch для ответа на ошибки в запросах.

app.get("/admin/phase/:level",async function(req,res){
  try{
    const onelevel = await Level.findOne({_id: req.params.level});
    const semster = await Semster.find({level: onelevel._id});
    let modules = [];
    for(let i = 0; i < semster.length; i++){
      let module = await Module.find({semster: semster[i]._id });
      modules.push(...module)
    };

        res.render("semster",{
            onelevels: onelevel,
            semsters: semster,
            modules: modules})
        })
      })
    })
  catch(err){
    res.status(500).render("/uhOhPage",{
        message: err.message
    })
 });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...