دوره‌ها / MongoDB / Many-to-Many (Many-to-Many)

Many-to-Many (Many-to-Many)

15 دقیقه Article

Many-to-Many: رابطه چند به چند 🔄

رابطه Many-to-Many زمانی است که چندین document با چندین document دیگر ارتباط دارند. برای این نوع رابطه، معمولاً از Referenced Documents یا یک collection میانی استفاده می‌شود.

روش 1: Array of References:

اگر تعداد ارتباطات کم است، می‌توانید array از IDs را در هر طرف نگه دارید:

// Students با courseIds
db.students.insertOne({ 
  name: "Ali", 
  courseIds: [
    ObjectId("507f1f77bcf86cd799439011"),
    ObjectId("507f1f77bcf86cd799439012")
  ]
})

// Courses با studentIds
db.courses.insertOne({ 
  name: "MongoDB", 
  studentIds: [
    ObjectId("507f1f77bcf86cd799439013"),
    ObjectId("507f1f77bcf86cd799439014")
  ]
})

// پیدا کردن courses یک student
db.courses.find({{
  _id: {{ $in: [ObjectId("507f1f77bcf86cd799439011"), ObjectId("507f1f77bcf86cd799439012")] }}
}})

روش 2: Collection میانی (توصیه می‌شود):

برای Many-to-Many با تعداد زیاد، از collection میانی استفاده کنید:

// Students
db.students.insertMany([
  { _id: ObjectId("507f1f77bcf86cd799439011"), name: "Ali" },
  { _id: ObjectId("507f1f77bcf86cd799439012"), name: "Sara" }
])

// Courses
db.courses.insertMany([
  { _id: ObjectId("507f1f77bcf86cd799439013"), name: "MongoDB" },
  { _id: ObjectId("507f1f77bcf86cd799439014"), name: "Node.js" }
])

// Enrollments (collection میانی)
db.enrollments.insertMany([
  { studentId: ObjectId("507f1f77bcf86cd799439011"), courseId: ObjectId("507f1f77bcf86cd799439013"), enrolledAt: new Date() },
  { studentId: ObjectId("507f1f77bcf86cd799439011"), courseId: ObjectId("507f1f77bcf86cd799439014"), enrolledAt: new Date() },
  { studentId: ObjectId("507f1f77bcf86cd799439012"), courseId: ObjectId("507f1f77bcf86cd799439013"), enrolledAt: new Date() }
])

// پیدا کردن courses یک student با aggregation
db.enrollments.aggregate([
  {{
    $match: {{ studentId: ObjectId("507f1f77bcf86cd799439011") }}
  }},
  {{
    $lookup: {{
      from: "courses",
      localField: "courseId",
      foreignField: "_id",
      as: "course"
    }}
  }},
  {{
    $unwind: "$course"
  }}
])
💡 نکته: Collection میانی برای Many-to-Many بهتر است چون می‌توانید metadata اضافی (مثل تاریخ ثبت‌نام) را هم ذخیره کنید و query ها انعطاف‌پذیرتر می‌شوند.
✅ یاد گرفتید: برای Many-to-Many، از Referenced Documents یا collection میانی استفاده کنید. Collection میانی برای موارد پیچیده‌تر بهتر است!

تمرین‌های عملی

برای تثبیت یادگیری این درس تمرین‌های زیر را حل کنید

تمرین: Many-to-Many Hard
سوال تمرین

🎯 تمرین: پیاده‌سازی Many-to-Many

یک رابطه many-to-many بین users و courses بسازید.

پاسخ تمرین
JAVASCRIPT
// با array از IDs
// User
{ _id: ObjectId("..."), name: "Ali", course_ids: [ObjectId("..."), ObjectId("...")] }

// Course
{ _id: ObjectId("..."), title: "MongoDB", student_ids: [ObjectId("..."), ObjectId("...")] }

// یا با collection جداگانه
// Enrollments
{ user_id: ObjectId("..."), course_id: ObjectId("...") }

آماده رفتن به درس بعدی هستید؟

این درس را به پایان رساندید و می‌توانید به درس بعدی بروید.