9

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

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

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

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

4

2 回答 2

16

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

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

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"});


有关MongoDB 读取操作的更多信息。

于 2013-07-30T12:08:19.213 回答
2

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

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

于 2013-07-30T00:01:07.460 回答