大多数时候,将单独的对象类型放入单独的集合中很有用。
假设我们有一个一对多关系:
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 的更多信息。