Това е случай на наличие на данни с връзка много към много. Мисля, че във вашата база данни има няколко хиляди студенти и няколкостотин курса.
Като начало мога да използвам следния дизайн с подробности за курса, вградени във всеки ученик като масив от поддокументи, наречени courses
.
- students collection
id:
name:
courses: [ { id: 1, name: }, { id: 5, name: }, ... ]
- courses collection
id:
name:
description:
Обърнете внимание, че идентификаторът и името на курса се съхраняват и в двете колекции. Това е дублиране на данни. Това трябва да е наред, тъй като дублираните детайли не се променят често (или може изобщо да не се променят).
Заявка за всички курсове, в които е записан студент, например:db.students.find( { name: "John" } )
. Това ще върне един студентски документ със съответстващото име и всички курсове (полето за масив). Вижте db.collection.find
.
Изпратете запитване към всички студенти, записани в определен курс:db.students.find( { "courses.name": "Java Programming" } )
. Това ще върне всички студентски документи, чието име на курса отговаря на критериите „Програмиране на Java“. Вижте Запитване до масив от вградени документи
.
Освен това можете да използвате проекция за изключване и включване полета от резултата.
БЕЛЕЖКИ:
- Можете да вградите информация за студентите в колекцията от курсове, вместо курсовете в студентите. Заявките ще бъдат подобни на горните, но вие ще правите заявки в колекцията от курсове. Зависи от вашия случай на употреба.
- Можете просто да съхраните полето за идентификационен номер на курса в масива курсове на колекцията студенти; това е случаят, когато полето за име на курса се променя често. Заявките ще използват Aggregation $lookup (операция „присъединяване“), за да получите курса и от колекцията от курсове.
- Информация за Дизайн на модел на данни за базирани на документи MongoDB данни.