如何使用 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 处理一对多关系的主要内容,如果未能解决你的问题,请参考以下文章