9

各エンティティ (Classroom には多くの生徒がいます) を個別の Meteor.collection オブジェクトに入れる必要があるのか​​、それとも Classroom オブジェクト内に生徒の配列を埋め込んで Meteor.collection Classroom オブジェクトを 1 つ持つ必要があるのか​​を自問しているシナリオに遭遇しています。 .

Classroom と Students をそれぞれ独自の Meteor.collections に配置するように本能的に指示されていますが、2 つの Meteor コレクション オブジェクト間に 1 対多の関係を確立する方法がわかりません。

従来の 1 対多、多対多の関係が Meteor のやり方に変換される場合はどうなるでしょうか。

私の質問は、 .aggregate() がサポートされていないという事実と、Meteor コレクションが存在する親ドキュメント (例: Classroom) 内で、ネストされた埋め込みドキュメントを取得するために再帰ループを実行しないと不可能であることを認識することから生じます。

4

2 に答える 2

16

ほとんどの場合、個別のオブジェクト タイプを個別のコレクションに入れると便利です。

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


MongoDB の読み取り操作に関する詳細情報。

于 2013-07-30T12:08:19.213 に答える
2

生徒用と教室用に別々のコレクションを作成する方が簡単に思えます。

各学生ドキュメントに「classroom」または「classroomId」フィールドを保持するだけで、必要に応じて 2 つのコレクションに参加できるようになると思います。

于 2013-07-30T00:01:07.460 に答える