Many-to-Many (Many-to-Many)
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("...") }
آماده رفتن به درس بعدی هستید؟
این درس را به پایان رساندید و میتوانید به درس بعدی بروید.