正确引用mongodb(关系)中的文档?

时间:2015-11-17 00:00:21

标签: mongodb data-structures mongodb-query database

我很难理解在MongoDB中正确引用文档的方法。假设我有以下集合:

  • 学校
  • 学生

我需要学生被引用到一个类,并且需要一个类来引用一个学校。通过附加的关系表在SQL中存储和查询非常简单。 为了有效地在两个方向上查询引用的数据,MongoDB的最佳方法是什么?

Mongo结构能否足够有效地结合以下所有场景?

  1. 查询属于学校的所有课程。
  2. 查询属于某个班级的学校。
  3. 查询属于某个班级的学生。
  4. 查询属于学校的学生。

1 个答案:

答案 0 :(得分:0)

单一参考

在单个参考结构中,例如student.classIdclass.schoolIdschool.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>})