Bird
Raised Fist0
MongoDBquery~10 mins

Many-to-many with references in MongoDB - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Many-to-many with references
Create Collection A
↓
Create Collection B
↓
Insert Documents in A with refs to B
↓
Insert Documents in B
↓
Query with $lookup to join
↓
Get combined results
This flow shows how the students collection references the courses collection to model many-to-many relations, then how to query them together.
Execution Sample
MongoDB
db.students.insertMany([
  {_id: 1, name: "Alice", courses: [101, 102]},
  {_id: 2, name: "Bob", courses: [102, 103]}
]);
db.courses.insertMany([
  {_id: 101, title: "Math"},
  {_id: 102, title: "History"},
  {_id: 103, title: "Science"}
]);
Insert students and courses with references to model many-to-many relationships.
Execution Table
StepActionCollectionDocument Inserted/UpdatedResulting State
1Insert student Alicestudents{"_id":1, "name":"Alice", "courses":[101,102]}students: [{_id:1, name:'Alice', courses:[101,102]}]
2Insert student Bobstudents{"_id":2, "name":"Bob", "courses":[102,103]}students: [{_id:1,...}, {_id:2, name:'Bob', courses:[102,103]}]
3Insert course Mathcourses{"_id":101, "title":"Math"}courses: [{_id:101, title:'Math'}]
4Insert course Historycourses{"_id":102, "title":"History"}courses: [{_id:101,...}, {_id:102, title:'History'}]
5Insert course Sciencecourses{"_id":103, "title":"Science"}courses: [{_id:101,...}, {_id:102,...}, {_id:103, title:'Science'}]
6Query students with course details using $lookupstudentsAggregation with $lookup on coursesResult: Each student document includes course info for referenced course IDs
7Exit--All documents inserted and joined successfully
💡 All inserts done and join query executed to combine related documents.
Variable Tracker
VariableStartAfter Step 1After Step 2After Step 3After Step 4After Step 5After Step 6Final
students[][{_id:1, name:'Alice', courses:[101,102]}][{_id:1,...}, {_id:2, name:'Bob', courses:[102,103]}][{_id:1,...}, {_id:2,...}][{_id:1,...}, {_id:2,...}][{_id:1,...}, {_id:2,...}][{_id:1,..., coursesInfo:[{_id:101,...},{_id:102,...}]}, {_id:2,..., coursesInfo:[{_id:102,...},{_id:103,...}]}][{_id:1,..., coursesInfo:[...]} , {_id:2,..., coursesInfo:[...]}]
courses[][][][{_id:101, title:'Math'}][{_id:101,...}, {_id:102, title:'History'}][{_id:101,...}, {_id:102,...}, {_id:103, title:'Science'}][{_id:101,...}, {_id:102,...}, {_id:103,...}][{_id:101,...}, {_id:102,...}, {_id:103,...}]
Key Moments - 3 Insights
Why do we store arrays of course IDs in student documents instead of embedding full documents?
Storing only IDs keeps documents small and avoids duplication. The execution_table step 6 shows how $lookup joins data at query time.
How does $lookup know which documents to join?
$lookup matches the array of IDs in students.courses with courses._id as shown in execution_table step 6, combining related documents.
What happens if a referenced course ID does not exist?
The $lookup will return an empty array for that course reference, so the student document will have fewer joined course details.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table at step 2. What is the courses array for student Bob?
A[101, 102]
B[102, 103]
C[101, 103]
D[]
💡 Hint
Check the 'Document Inserted/Updated' column at step 2 in execution_table.
At which step do we insert the course titled 'History'?
AStep 4
BStep 3
CStep 5
DStep 6
💡 Hint
Look at the 'Action' and 'Document Inserted/Updated' columns in execution_table.
If we remove course ID 102 from Alice's courses array, what changes in variable_tracker after step 6?
AAlice's coursesInfo will be empty
BAlice's coursesInfo will include courses 101 and 102 details
CAlice's coursesInfo will include only course 101 details
DNo change in coursesInfo
💡 Hint
Refer to variable_tracker row for 'students' after step 6 showing coursesInfo arrays.
Concept Snapshot
Many-to-many with references in MongoDB:
- Store arrays of course IDs in student documents.
- Use $lookup aggregation to join related documents.
- Keeps data normalized and queries flexible.
- Example: students have courses array of course IDs.
- Query joins students with course details by matching IDs.
Full Transcript
This visual execution shows how to model many-to-many relationships in MongoDB using references. We create two collections, students and courses. Each student document stores an array of course IDs they attend. Each course document stores its details. We insert sample students and courses. Then we use the $lookup aggregation stage to join students with their course documents by matching course IDs. The execution table traces each insert and the join query step-by-step. The variable tracker shows how the students and courses collections grow and how the joined results include course details. Key moments clarify why we store IDs instead of full documents and how $lookup works. The quiz tests understanding of the data at each step. This method keeps data normalized and queries efficient for many-to-many relations.

Practice

(1/5)
1. What does a many-to-many relationship with references mean in MongoDB?
easy
A. Only one collection has references, the other does not.
B. One collection stores all data, the other is empty.
C. Both collections store arrays of IDs pointing to each other.
D. Data is duplicated in both collections without IDs.

Solution

  1. Step 1: Understand many-to-many references

    In MongoDB, many-to-many means each document in one collection can link to many documents in another, and vice versa.
  2. Step 2: Identify how references are stored

    This is done by storing arrays of IDs in both collections, so each side knows its related documents.
  3. Final Answer:

    Both collections store arrays of IDs pointing to each other. -> Option C
  4. Quick Check:

    Many-to-many references = arrays of IDs in both collections [OK]
Hint: Many-to-many means both sides hold arrays of IDs [OK]
Common Mistakes:
  • Thinking only one side stores references
  • Confusing many-to-many with embedding all data
  • Assuming data is duplicated without IDs
2. Which of the following is the correct way to store references for a many-to-many relationship between students and courses collections in MongoDB?
easy
A. { _id: 1, name: 'Alice', courses: 101 } and { _id: 101, title: 'Math', students: 1 }
B. { _id: 1, name: 'Alice', courses: [101, 102] } and { _id: 101, title: 'Math', students: [1, 2] }
C. { _id: 1, name: 'Alice', courses: 'Math' } and { _id: 101, title: 'Math', students: 'Alice' }
D. { _id: 1, name: 'Alice', courses: [] } and { _id: 101, title: 'Math', students: [] }

Solution

  1. Step 1: Check reference format

    References must be arrays of IDs to represent many-to-many links.
  2. Step 2: Validate { _id: 1, name: 'Alice', courses: [101, 102] } and { _id: 101, title: 'Math', students: [1, 2] }

    { _id: 1, name: 'Alice', courses: [101, 102] } and { _id: 101, title: 'Math', students: [1, 2] } shows arrays of IDs in both collections, correctly linking students and courses.
  3. Final Answer:

    { _id: 1, name: 'Alice', courses: [101, 102] } and { _id: 101, title: 'Math', students: [1, 2] } -> Option B
  4. Quick Check:

    Arrays of IDs in both collections = correct syntax [OK]
Hint: Use arrays of IDs, not single values or names [OK]
Common Mistakes:
  • Using single ID instead of array for many-to-many
  • Storing names instead of IDs as references
  • Leaving reference arrays empty without reason
3. Given these two documents:
{ _id: 1, name: 'Bob', courses: [201, 202] }
{ _id: 201, title: 'History', students: [1, 3] }
What will be the result of querying the courses array for student with _id: 1?
medium
A. ['History']
B. [1, 3]
C. []
D. [201, 202]

Solution

  1. Step 1: Identify the student's courses field

    The student document with _id 1 has a courses array: [201, 202].
  2. Step 2: Understand the query result

    Querying the courses array for this student returns the IDs [201, 202], not titles or student IDs.
  3. Final Answer:

    [201, 202] -> Option D
  4. Quick Check:

    Student's courses array = [201, 202] [OK]
Hint: Query returns stored IDs, not linked document fields [OK]
Common Mistakes:
  • Confusing course IDs with student IDs
  • Expecting course titles instead of IDs
  • Assuming empty array if unsure
4. You have these two collections:
students: { _id: 2, name: 'Eve', courses: [301] }
courses: { _id: 301, title: 'Science', students: [] }
What is the problem with this many-to-many reference setup?
medium
A. The students array in courses is missing the student ID.
B. The courses array in students is empty.
C. The student document is missing the courses field.
D. The course document has an invalid _id.

Solution

  1. Step 1: Check references in both collections

    The student document lists course 301, but the course document's students array is empty.
  2. Step 2: Identify missing reciprocal reference

    For many-to-many, both sides must reference each other. The course's students array should include student ID 2.
  3. Final Answer:

    The students array in courses is missing the student ID. -> Option A
  4. Quick Check:

    Both sides must reference each other [OK]
Hint: Both sides must list each other's IDs [OK]
Common Mistakes:
  • Ignoring missing reciprocal references
  • Assuming one side is enough
  • Confusing empty arrays with missing fields
5. You want to find all courses taken by students who are enrolled in both course 401 and 402. Given collections with many-to-many references, which MongoDB aggregation pipeline stage helps find students enrolled in both courses?
hard
A. { $match: { courses: { $all: [401, 402] } } }
B. { $match: { courses: { $in: [401, 402] } } }
C. { $match: { courses: 401 } }
D. { $match: { courses: { $size: 2 } } }

Solution

  1. Step 1: Understand the query goal

    We want students enrolled in both courses 401 and 402, so their courses array must contain both IDs.
  2. Step 2: Choose correct MongoDB operator

    The $all operator matches arrays containing all specified elements, perfect for this case.
  3. Final Answer:

    { $match: { courses: { $all: [401, 402] } } } -> Option A
  4. Quick Check:

    $all matches arrays containing all elements [OK]
Hint: Use $all to match arrays containing all specified IDs [OK]
Common Mistakes:
  • Using $in matches any, not all elements
  • Using $size only checks array length, not content
  • Matching single course ID misses the second course
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard