我很难理解在MongoDB中正确引用文档的方法。假设我有以下集合:
我需要学生被引用到一个类,并且需要一个类来引用一个学校。通过附加的关系表在SQL中存储和查询非常简单。 为了有效地在两个方向上查询引用的数据,MongoDB的最佳方法是什么?
Mongo结构能否足够有效地结合以下所有场景?
答案 0 :(得分:0)
在单个参考结构中,例如student.classId
,class.schoolId
,school.id
,操作1和3可以在单个find
操作中完成。 2和4可以完成两个:
1查询属于学校的所有课程。
db.classes.find({schoolId: <school-id>})
2查询属于某个班级的学校。
const schoolId = db.classes.findOne({_id: <class-id>}).schoolId;
const school = db.schools.findOne({_id: schoolId});
3查询属于某个班级的学生。
db.students.find({classId: <class-id>})
4查询属于学校的学生。
const classesForSchool = db.classes.find({schoolId: <school-id>});
const classIds = classesForSchool.map(class => class._id);
const students = db.students.find({classId: {$in: classIds}});
您可能会考虑使用两个集合:一个带有学校(有一个嵌套的对象数组),另一个带有学生。在这种情况下,所有4个都是单个查询。您可以通过添加如下所示的唯一索引来保持数据完整性:
db.schools.createIndex({'classes._id': 1}, {unique: true})`
所有查询都是这样的:
1查询属于学校的所有课程。
db.schools.findOne({_id: <school-id>}).classes
2查询属于某个班级的学校。
db.schools.findOne({'classes._id': <class-id>})
3查询属于某个班级的学生。
db.students.find({classId: <class-id>})
4查询属于学校的学生。
db.students.find({schoolId: <school-id>})