繁体   English   中英

如何使用 Moongoose 访问整个子文档(对象数组中的对象数组)?

[英]How to get access to entire subdocument(array of objects within array of objects) using moongoose?

我的架构:

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);

示例文档:

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});
  }
})
});

在这里,我需要知道如何使用班级 ID 访问各个班级并将学生数组打印为“classDet”中的列表基本上我正在创建一个学校管理系统,其中将有许多班级和班级内部将是学生名单。 我只想在父类访问时打印每个类中的所有学生。

您可以尝试以下任一方法:

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()中使用.lean().find()文档转换为 Js 对象,以便在代码中处理数据时访问数据中的键。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM