【问题标题】:Properly referencing documents in mongodb (relations)?正确引用 mongodb(关系)中的文档?
【发布时间】:2015-11-17 00:00:21
【问题描述】:

我很难理解在 MongoDB 中正确引用文档的方式。假设我有以下收藏:

  • 学校
  • 学生

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

Mongo 结构对于以下所有场景的组合是否足够高效?

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

【问题讨论】:

    标签: mongodb data-structures mongodb-query database


    【解决方案1】:

    单一参考

    在单个引用结构中,例如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>})
    

    【讨论】:

      猜你喜欢
      • 2019-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-23
      • 2018-07-15
      • 1970-01-01
      • 2021-06-20
      • 2015-12-14
      相关资源
      最近更新 更多