【问题标题】:Meteor: Embed documents inside a document or separate them into each collection object and link them?Meteor:将文档嵌入到文档中还是将它们分离到每个集合对象中并链接它们?
【发布时间】:2013-07-29 23:00:19
【问题描述】:

我遇到了一个场景,我问自己是否需要将每个实体(一个教室有很多学生)放入单独的 Meteor.collection 对象中,或者将一组学生嵌入到教室对象中并拥有一个 Meteor。集合 Classroom 对象。

我的直觉告诉我将 Classroom 和 Students 放在他们自己的 Meteor.collections 中,但我不确定如何在两个 Meteor 集合对象之间建立一对多的关系。

如果有更多传统的一对多、多对多关系转化为 Meteor 的做事方式怎么办?

我的问题源于不支持 .aggregate() 的事实,并且意识到如果不执行递归循环来获取嵌套和嵌入文档是不可能的,在 Meteor 集合存在的父文档中(例如教室)。

【问题讨论】:

    标签: mongodb database-design meteor


    【解决方案1】:

    大多数时候,将单独的对象类型放入单独的集合中很有用。

    假设我们有一个一对多关系:

    Classrooms.insert({
      _id: "sdf8ad8asdj2jef",
      name: "test classroom"
    });
    
    Students.insert({
      _id: "lof8gzanasd9a7j2n",
      name: "John"
      classroomId: "sdf8ad8asdj2jef"
    });
    


    获取课堂上的所有学生sdf8ad8asdj2jef

    Students.find({classroomId: "sdf8ad8asdj2jef"});
    

    与学生lof8gzanasd9a7j2n一起进入教室:

    var student = Studtents.findOne("lof8gzanasd9a7j2n");
    var classroom = Classrooms.find(student.classroomId);
    


    当您打算使用Meteor.publish()Meteor.subscribe() 时,将对象放入单独的集合中特别有用。 当您只想将与用户真正相关的数据发布到客户端时,Meteor.publish() 非常方便。

    以下内容仅发布使用给定classroomId 的房间中的学生。 (因此客户端不必从服务器数据库中下载所有学生对象。只有那些相关的。)

    Meteor.publish("students", function (classroomId) {
      return Students.find({classroomId: classroomId});
    });
    


    多对多关系也没有那么复杂:

    Classrooms.insert({
      _id: "sdf8ad8asdj2jef",
      name: "test classroom"
      studentIds: ["lof8gzanasd9a7j2n"]
    });
    
    Students.insert({
      _id: "lof8gzanasd9a7j2n",
      name: "John"
      classroomIds: ["sdf8ad8asdj2jef"]
    });
    


    获取课堂上的所有学生sdf8ad8asdj2jef

    Students.find({classroomIds: "sdf8ad8asdj2jef"});
    

    获取学生lof8gzanasd9a7j2n的所有教室:

    Classrooms.find({studentIds: "lof8gzanasd9a7j2n"});
    


    有关MongoDBs read operations 的更多信息。

    【讨论】:

    • 对于多对多关系,您是否建议在每个对象中存储外部 id,或者将一个集合作为映射,例如 Rosters,其架构为 {student_id:123,教室ID:234}?
    • 根据我的经验,我建议将 id 存储在每个对象中,因为这样查询往往会更容易一些。但这实际上取决于整体用例。我建议为这两种机会实施一个小样本,并检查添加、更新、删除和查询的复杂性。 (选择正确的模式将为您节省大量工作。)如果您使用 Meteor.publish() 和 Meteor.subscribe() 来限制发送到客户端的数据,请检查您的限制是否适用于这两种情况。
    • 感谢您的回复。发布和订阅让这更容易处理!
    【解决方案2】:

    学生和教室的单独收藏似乎更直接。

    我认为只要在每个学生文档中保留一个“教室”或“课堂 ID”字段,您就可以在必要时加入这两个集合。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-14
      • 2021-03-13
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 2021-03-02
      • 2020-09-20
      • 1970-01-01
      相关资源
      最近更新 更多