我遇到了一个场景,我在问我自己是否需要将每个实体(一个Classroom有很多学生)放入单独的Meteor.collection对象中,或者将一组学生嵌入教室对象中并拥有一个Meteor。收集课堂对象。
我的直觉告诉我将Classroom和Students放在他们自己的Meteor.collections中,但我不确定如何在两个Meteor集合对象之间建立一对多的关系。
如果有更多传统的一对多,多对多关系转化为Meteor的做事方式会怎样?
我的问题源于这样一个事实:.aggregate()不受支持,并且意识到如果不进行递归循环来抓取嵌套和嵌入文档,在存在Meteor集合的父文档(例如Classroom)中是不可能的。
答案 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”字段,就可以在必要时加入这两个馆藏。