Meteor:将文档嵌入文档中或将它们分成每个集合对象并链接它们?

时间:2013-07-29 23:53:28

标签: mongodb database-design meteor

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

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

如果有更多传统的一对多,多对多关系转化为Meteor的做事方式会怎样?

我的问题源于这样一个事实:.aggregate()不受支持,并且意识到如果不进行递归循环来抓取嵌套和嵌入文档,在存在Meteor集合的父文档(例如Classroom)中是不可能的。

2 个答案:

答案 0 :(得分: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"});


有关MongoDBs read operations的更多信息。

答案 1 :(得分:2)

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

我认为只要在每个学生档案中保留一个“教室”或“classroomId”字段,就可以在必要时加入这两个馆藏。