如何使用 mongoose refs 处理一对多关系

Posted

技术标签:

【中文标题】如何使用 mongoose refs 处理一对多关系【英文标题】:how to use mongoose refs to handle one-to-many relation 【发布时间】:2019-04-21 17:56:10 【问题描述】:

我有两个架构,如下所示

Student.js

module.exports = (mongoose) => 
const Schema = mongoose.Schema;
const studentsSchema = new Schema(
    name :  
        type : String,
        required : true
    ,
    roll : 
        type : Number,
        default : null
    ,
    class : 
        type : String,
        default : null
    
);

return mongoose.model('students', studentsSchema);
;

Subject.js

module.exports = (mongoose) => 
 const Schema = mongoose.Schema;
 const subjectSchema = new Schema(
    title :  
        type : String,
        required : true
    ,
    author : 
        type : String,
        default : null
    ,
    price : 
        type : Number,
        default : null
    ,
    studentId : 
        type : String
    
);

return mongoose.model('subjects', subjectSchema);
;

我需要在 Student 模型上运行 find 查询以获取学生数组。每个学生都将包含一系列他的科目。主题数组的每个索引都将包含主题的完整对象。如下。

[
  
    name : "student 1",
    roll : 1234,
    class : "TEN",
    subjects : [
      
        title : 'English',
        author : 'peter',
        price : 210
      ,
      
        title : 'Math',
        author : 'Nelson',
        price : 222
      
    ]
  
]

我怎样才能通过使用 refs 来实现它?

【问题讨论】:

Referencing another schema in Mongoose的可能重复 【参考方案1】:

您可以使用ref 功能并进行填充。

它看起来像:

 const subjectSchema = new Schema(
    title :  
        type : String,
        required : true
    ,
    author : 
        type : String,
        default : null
    ,
    price : 
        type : Number,
        default : null
    
    // studentId : 
    //     type : String
    // 
    // ^ You don't need to save the student id, since the ids of the subject
    //   will be saved in your Student schema
);

mongoose.model('subjects', subjectSchema);

const studentsSchema = new Schema(
    name :  
        type : String,
        required : true
    ,
    roll : 
        type : Number,
        default : null
    ,
    class : 
        type : String,
        default : null
    ,
    subjects: [ type: Schema.Types.ObjectId, ref: 'subjects' ]
    // ^ Add the reference to subjects
);

mongoose.model('students', studentsSchema);

然后就可以查询了

mongoose.model( "students" ).find().populate( "subjects" ).exec( ( results, error ) => 
   console.log( results ); //  ... subjects: [ ... ] 
 );

【讨论】:

您好@drinchev,主题中需要studentId。因为,我不想收集所有主题。我只想获取包含目标 studentId 的选择性科目。

以上是关于如何使用 mongoose refs 处理一对多关系的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 mongoose 从 refs 获取数组

MongoDB / Mongoose 一对多关系

如何通过mongoose中的查询ref对象获取数据

如何在 Mongoose 中搜索填充数组 [包含 ref 的数组]

mongoose 怎么插入嵌套数组

Mongoose基于MongoDB建模并设置关联