2013-07-29 9 views
9

Występuję w scenariuszu, w którym zadaję sobie pytanie, czy muszę umieścić każdą jednostkę (Classroom ma wielu studentów) w osobnym obiekcie Meteor.collection lub raczej osadzić tablicę studentów wewnątrz obiektu w klasie i mieć jeden zbiór Meteor.collection Obiekt Classroom.Meteor: Osadzić dokumenty w dokumencie lub podzielić je na każdy obiekt kolekcji i połączyć je?

Instynkt podpowiada mi, aby umieścić Classroom i Studentów w swoich zbiorach meteorytów, ale nie jestem pewien, jak ustanowić jeden do wielu relacji między dwoma przedmiotami kolekcji Meteor.

Co, jeśli istnieje dużo więcej tradycyjnych relacji jeden do wielu, wiele do wielu przekłada się na sposób działania Meteor?

Moje pytanie wynika z faktu, że funkcja .aggregate() nie jest obsługiwana i zdaje sobie sprawę, że jest to niemożliwe bez wykonywania pętli rekursywnej w celu pobrania dokumentów zagnieżdżonych i osadzonych wewnątrz dokumentu nadrzędnego, w którym istnieje zbiór Meteor (np. Classroom) .

Odpowiedz

16

W większości przypadków przydatne jest umieszczanie oddzielnych typów obiektów w oddzielnych kolekcjach.

Powiedzmy mamy jeden do wielu relacji:

Classrooms.insert({ 
    _id: "sdf8ad8asdj2jef", 
    name: "test classroom" 
}); 

Students.insert({ 
    _id: "lof8gzanasd9a7j2n", 
    name: "John" 
    classroomId: "sdf8ad8asdj2jef" 
}); 


Get wszystkich uczniów w klasie sdf8ad8asdj2jef:

Students.find({classroomId: "sdf8ad8asdj2jef"}); 

uzyskać klasę Student lof8gzanasd9a7j2n:

var student = Studtents.findOne("lof8gzanasd9a7j2n"); 
var classroom = Classrooms.find(student.classroomId); 


Oddanie obiektów do oddzielnych zbiorów jest szczególnie przydatna, gdy masz zamiar użyć Meteor.publish() i Meteor.subscribe(). Meteor.publish() jest bardzo przydatny, gdy chcesz opublikować dane tylko dla klienta, które są naprawdę istotne dla użytkownika.

Następujące publikuje tylko studentów, którzy są w pokoju z danym classroomId. (Tak więc klient nie musi pobierać wszystkich obiektów ucznia z bazy danych serwera, tylko te, które są istotne.)

Meteor.publish("students", function (classroomId) { 
    return Students.find({classroomId: classroomId}); 
}); 


Wiele do wielu relacji również nie są skomplikowane:

Classrooms.insert({ 
    _id: "sdf8ad8asdj2jef", 
    name: "test classroom" 
    studentIds: ["lof8gzanasd9a7j2n"] 
}); 

Students.insert({ 
    _id: "lof8gzanasd9a7j2n", 
    name: "John" 
    classroomIds: ["sdf8ad8asdj2jef"] 
}); 


Get wszystkich uczniów w klasie sdf8ad8asdj2jef:

Students.find({classroomIds: "sdf8ad8asdj2jef"}); 

Get wszystkich klas ze studenta lof8gzanasd9a7j2n:

Classrooms.find({studentIds: "lof8gzanasd9a7j2n"}); 


Więcej informacji na MongoDBs read operations.

+0

Dla relacji wiele do wielu, czy zaleca się przechowywanie obcych identyfikatorów w każdym z obiektów, czy też jedną kolekcję jako mapę, np. Rosters, która ma schemat {student_id: 123, classroomId: 234}? –

+0

Z mojego doświadczenia poleciłbym przechowywanie identyfikatorów w każdym z obiektów, ponieważ zapytania są w ten sposób nieco łatwiejsze. Ale to naprawdę zależy od ogólnego przypadku użycia. Polecam zaimplementować małą próbkę dla obu możliwości i sprawdzić dodawanie, aktualizowanie, usuwanie i tworzenie zapytań złożoności. (Wybór odpowiedniego schematu pozwoli zaoszczędzić sporo pracy.) Jeśli używasz Meteor.publish() i Meteor.subscribe() w celu ograniczenia danych wysyłanych do klienta, sprawdź, czy twoje ograniczenia działają w obu przypadkach. –

+0

Dziękuję za odpowiedź. opublikuj i subskrybuj to sprawiło, że jest to o wiele łatwiejsze w obsłudze! –

2

Oddzielne kolekcje dla studentów i klas wydaje się prostsze.

Myślę, że po prostu trzymanie pola "klasa" lub "classroomId" w każdym dokumencie ucznia pozwoli Ci dołączyć do dwóch kolekcji, gdy zajdzie taka potrzeba.

Powiązane problemy