Пн goose: Агрегация возвращает пустое значение - PullRequest
0 голосов
/ 19 июня 2020

Я использую агрегацию для объединения 3 коллекций. Но результатом соединения является пустой массив []. Это моя модель для всех 3 коллекций вместе с запросами на агрегат. Результат console.log (расписание) return []. Я использую ссылки для ссылки на поле в Расписании с соответствующей коллекцией.

Модели расписания

var TimetableSchema = new mongoose.Schema ({

    timeslot: {
        required: true, 
        'type': String,
    },

    classroom :{
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Classroom'
    },

    subject :{
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Subject'
    },

    teacher :{
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User'   
    },

    day :{
        type:String, 
        required: true, 
    },

    year :{
        type:String, 
        required: true, 
    },

    session :{
        type:String,
        required:true,
    }


})

Классные модели

var ClassroomSchema = new mongoose.Schema ({


    classroom_name: {
        type:String,
        required:true,
        unique: true,
    },

    classroom_blok:{
        type:String,
        required:true,
    },

    classroom_floor: {
        type:String,
        required:true,
    },


});

Тема

var SubjectSchema = new mongoose.Schema ({

    subject_id: {

        required: true, 
        'type': String,
        'default': shortid.generate
    },

    subject_name: {
        type:String,
        required:true,
    },

    subject_darjah:{
        type:String,
        required:true,
    }

});

Сводный запрос

router.get('/today_absentee/view/:id',function(req,res){
  Teacher.findById(req.session.userId).exec(function (error, user){
    if (error){
      return next(error);
    }else
    {
      Teacher.find({_id:req.params.id }).exec(function(err, teacher){
        if(err)
        {
          return next(err);
        }else
        {
          Timetable.aggregate([

            {
                // This is doing the same thing as the previous .find()
               $match: {  teacher:req.params.id}
            },
            {
              $lookup:{
                  from: "Classroom",       // other table name
                  localField: "classroom",   // name of users table field
                  foreignField: "_id", // name of userinfo table field
                  as: "classroom"         // alias for userinfo table
              }



            },

            {   $unwind:"$classroom" },     // $unwind used for getting data in object or for one record only

            {
              $lookup:{
                  from: "Subject",       // other table name
                  localField: "subject",   // name of users table field
                  foreignField: "_id", // name of userinfo table field
                  as: "subject"         // alias for userinfo table
              }  
            },

            {   $unwind:"$subject" },     // $unwind used for getting data in object or for one record only

            // define some conditions here 
            {
                $match:{
                $and:[{teacher:req.params.id}]
                 }
            },

            // define which fields are you want to fetch
             {   
                $project:{

                    subject_name : "$subject.subject_name",
                    classroom : "$classroom.classroom_name",
                } 
             }
          ]).exec(function(err, timetable) 
          {
            // The query output is such that `classroom.classroom_name`
            // value is unique for each document
            if (err) throw err;
            console.log(currentYear);
            console.log(timetable);
            res.render('creator_content/today_absentee_id',{timetable:timetable,  user:user, teacher:teacher});
          });
        }
      });


    }
  });
});

Модели для всех 3 коллекций.

1 Ответ

0 голосов
/ 19 июня 2020

Импортируйте mon goose в верхней части файла, а затем используйте mon goose .Types.ObjectId () при сопоставлении с любыми полями идентификатора объекта в агрегированном запросе . Я также использовал конвейер агрегации $ addFields , чтобы добавить 2 поля (subject_name, classroom), а затем вывести их на следующем этапе, используя $ project .

const mongoose = require("mongoose");

router.get('/today_absentee/view/:id', function(req, res) {
  Teacher.findById(req.session.userId).exec(function(error, user) {
    if (error) {
      return next(error);
    } else {
      Teacher.find({
        _id: req.params.id
      }).exec(function(err, teacher) {
        if (err) {
          return next(err);
        } else {
          Timetable.aggregate([

            {
              // This is doing the same thing as the previous .find()
              $match: {
                teacher: mongoose.Types.ObjectId(req.params.id)
              }
            },
            {
              $lookup: {
                from: "Classroom", // other table name
                localField: "classroom", // name of users table field
                foreignField: "_id", // name of userinfo table field
                as: "classroom" // alias for userinfo table
              }
            },
            {
              $unwind: "$classroom"
            }, // $unwind used for getting data in object or for one record only

            {
              $lookup: {
                from: "Subject", // other table name
                localField: "subject", // name of users table field
                foreignField: "_id", // name of userinfo table field
                as: "subject" // alias for userinfo table
              }
            },

            {
              $unwind: "$subject"
            }, // $unwind used for getting data in object or for one record only

            // define some conditions here 
            {
              $match: {
                $and: [{
                  teacher: mongoose.Types.ObjectId(req.params.id)
                }]
              }
            },

            // Add new field names
            {
              $addFields: {
                subject_name: "$subject.subject_name",
                classroom: "$classroom.classroom_name",
              }
            },

            // define which fields are you want to fetch
            {
              $project: {
                subject_name: 1,
                classroom: 1,
              }
            }
          ]).exec(function(err, timetable) {
            // The query output is such that `classroom.classroom_name`
            // value is unique for each document
            if (err) throw err;
            console.log(currentYear);
            console.log(timetable);
            res.render('creator_content/today_absentee_id', {
              timetable: timetable,
              user: user,
              teacher: teacher
            });
          });
        }
      });

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