Как получить доступ ко всему поддокументу (массиву объектов в массиве объектов), используя луну goose? - PullRequest
1 голос
/ 21 февраля 2020

моя схема:

var schoolSchema = new mongoose.Schema({
    name: String,
    classes:[
      {
       c_name:String,
       c_strn:String,
       students:[
       {s_name:String,
        s_roll:String,
        s_address:String
       }
       ]
      }
    ],
});
var school = mongoose.model('school',schoolSchema);

Образец Do c:

var sainik = new school({name:'sain',
                         classes:
                         [
                          {
                          c_name:'1(one)',
                          c_strn:'100',
                          students:[
                            {
                              s_name:"Leo",
                              s_roll:"17",
                              s_address:"strt24",
                            },
                            {
                              s_name:"Kyle",
                              s_roll:"18",
                              s_address:"strt24",
                            }
                          ]//array of students
                          }
                         ]//array of classes
                        });
sainik.save().then(()=>console.log("Save it"));

Код:

app.get('/home/:id/:cid',function(req, res){
school.find().exec(function(err,data){
  if (err){
    console.log(err);
  }
  else{
    console.log(data);
    res.render("classDet",{data:data});
  }
})
});

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

1 Ответ

0 голосов
/ 21 февраля 2020

Вы можете попробовать любой из этих способов:

app.get('/home/:id/:cid', function (req, res) {
    school.find({ id: id, 'classes.c_id': cid }, { _id: 0, 'classes.c_id.$.students': 1 }).lean().exec(function (err, data) {
        if (err) {
            console.log(err);
        }
        else {
            console.log(data);
            res.render("classDet", { data: data });
        }
    })
})

Тест: MongoDB-Playground

app.get('/home/:id/:cid', function (req, res) {
    school.aggregate([{ $match: { id: id } }, { $unwind: '$classes' }, { $match: { 'classes.c_id': cid } }, { $project: { _id: 0, students: '$classes.students' } }]).exec(function (err, data) {
        if (err) {
            console.log(err);
        }
        else {
            console.log(data);
            res.render("classDet", { data: data });
        }
    })
})

Тест : MongoDB-Playground

Примечание: Будет небольшая разница в обоих результатах, вы можете проверить ее и выбрать один из них, также сохраняйте помните, что если в запросе id из запроса выполняется поиск по _id в БД, вам необходимо преобразовать строку id в ObjectId(), прежде чем использовать ее в запросах. Также мы используем .lean() в .find() для преобразования mon goose документов в Js объекты для доступа к ключам данных при работе с ними в коде.

...