Dit is een geval van het hebben van de gegevens met een veel-op-veel-relatie. Ik zou denken dat er een paar duizend studenten en een paar honderd cursussen in je database zitten.
Om te beginnen kan ik het volgende ontwerp gebruiken met cursusdetails ingesloten bij elke student als een reeks subdocumenten genaamd courses
.
- students collection
id:
name:
courses: [ { id: 1, name: }, { id: 5, name: }, ... ]
- courses collection
id:
name:
description:
Let op, de cursus-ID en naam worden in beide collecties opgeslagen. Dit is verdubbeling van gegevens. Dit zou in orde moeten zijn, aangezien de gedupliceerde details niet vaak veranderen (of helemaal niet veranderen).
Vraag alle cursussen op waarvoor een student is ingeschreven, bijvoorbeeld:db.students.find( { name: "John" } )
. Dit levert één studentendocument op met de overeenkomende naam en alle cursussen (het matrixveld). Zie db.collection.find
.
Vraag alle studenten die zijn ingeschreven voor een bepaalde cursus:db.students.find( { "courses.name": "Java Programming" } )
. Hiermee worden alle studentendocumenten geretourneerd waarvan de cursusnaam overeenkomt met de criteria "java-programmering". Zie Een array van ingesloten documenten opvragen
.
Verder kunt u projectie . gebruiken uitsluiten en opnemen velden uit het resultaat.
OPMERKINGEN:
- Je kunt studenteninformatie insluiten in de cursuscollectie, in plaats van de cursussen in de studenten. De zoekopdrachten zullen vergelijkbaar zijn met de bovenstaande, maar u zult de cursusverzameling opvragen. Het hangt af van uw gebruik.
- Je kunt het cursus-ID-veld gewoon opslaan in de cursusreeks van de studentencollectie; dit is het geval wanneer de veldnaam van de cursus vaak verandert. De zoekopdrachten gebruiken Aggregation $lookup (een "join"-operatie) om de cursus en uit de cursuscollectie te halen.
- Informatie over Datamodelontwerp voor op documenten gebaseerde MongoDB-gegevens.