Detta är ett fall av att ha data med många-till-många-relation. Jag skulle tro att det finns några tusen studenter och några hundra kurser i din databas.
Till att börja med kan jag använda följande design med kursdetaljer inbäddade med varje student som en rad underdokument som kallas courses
.
- students collection
id:
name:
courses: [ { id: 1, name: }, { id: 5, name: }, ... ]
- courses collection
id:
name:
description:
Observera att kursens id och namn lagras i båda samlingarna. Detta är dubblering av data. Detta borde vara okej, eftersom de duplicerade detaljerna inte ändras ofta (eller kanske inte ändras alls).
Fråga alla kurser som en student är inskriven i, till exempel:db.students.find( { name: "John" } )
. Detta kommer att returnera ett studentdokument med matchande namn och alla kurser (matrisfältet). Se db.collection.find
.
Fråga alla elever som är anmälda till en viss kurs:db.students.find( { "courses.name": "Java Programming" } )
. Detta kommer att returnera alla studentdokument som har kursnamnet som matchar kriterierna "java programmering". Se Fråga en rad inbäddade dokument
.
Vidare kan du använda projektion att exkludera och inkludera fält från resultatet.
ANMÄRKNINGAR:
- Du kan bädda in studentinformation i kurssamlingen, istället för kurserna i eleverna. Frågorna kommer att likna de ovanstående, men du kommer att fråga i kurssamlingen. Det beror på ditt användningsfall.
- Du kan bara lagra kurs-id-fältet i kursmatrisen i studentsamlingen; detta är fallet när du ofta ändrar kursnamnfält. Frågorna kommer att använda Aggregation $lookup (en "join" operation) för att få kursen och från kurssamlingen.
- Information om Datamodelldesign för dokumentbaserad MongoDB-data.