那么你有Course
s, Student
s 和Class
es,它们是Course
s 的一部分并且被 s 访问过Student
?如果你仔细想想,我认为这个问题会自行回答。如果您摆脱 MongoDB 的纯 JSON 并查看如何在 ODM(相当于 RDB 中的 ORM)中定义它,可能会更清楚,因为基于文档的 DB 并没有真正强制执行它们自己的模式(示例是基于MongoEngine
为 Python开启):
class Student(Document):
name = StringField(max_length=50)
address = StringField()
class Attendance(EmbeddedDocument):
student = ReferenceField(Student)
grade = IntField(min_value=0, max_value=100)
class Class(EmbeddedDocument):
name = StringField(max_length=100)
start_time = DateTimeField()
attendance_list = ListField(EmbeddedDocumentField(Attendance))
class Course(Document):
name = StringField(max_length=100)
classes = ListField(EmbeddedDocumentField(Class))
这将为您提供两个集合:一个用于Student
s,一个用于Course
s。Attendance
将嵌入到Class
es 中,而Class
es 将嵌入到Course
s 中。像这样的东西(伪代码):
Student = {
name: String,
address: String
}
Course = {
name: String,
classes: {
name: String,
start_time: DateTime,
attendance_list: {
student: Student,
grade: Integer
}[]
}[]
}
您当然可以将成绩信息放在学生对象中,但最终您确实无能为力来摆脱额外的课程。