نمطا القيم الشاذة وبنية الشجرة
سيتعامل المتعلمون مع المستندات التي تحتوي على مصفوفات كبيرة بشكل غير معتاد باستخدام نمط القيم الشاذة، ويمثلون بيانات الأشجار الهرمية باستخدام مراجع الأصل أو المسارات المادية.
نمطا القيم الشاذة وبنية الشجرة درس مجاني في MongoDB Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في MongoDB Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة MongoDB Academy 4 دروس في المجموع.
مشكلة القيم الشاذة
تحتوي معظم مجموعات MongoDB على مستندات تتبع توزيعًا متوقعًا للأحجام. لكنك قد تواجه أحيانًا قيمًا شاذة، وهي مستندات تنحرف كثيرًا عن المعتاد. فقد يجمع منشور على وسائل التواصل الاجتماعي، إذا انتشر انتشارًا واسعًا، 50,000 تعليق، بينما تحتوي المنشورات المعتادة على 5–20 تعليقًا. وقد يحصل منتج أعجب به أحد المشاهير على 10,000 مراجعة. يؤدي تصميم المخطط وفق الحالة المتوسطة مع تجاهل القيم الشاذة إلى وصول المستندات في النهاية إلى حد الحجم البالغ 16 MB، أو إلى ضغط على الذاكرة.
اكتشاف المستندات ذات القيم الشاذة
قبل تصميم الحلول للقيم الشاذة، حدّد ما إذا كانت موجودة فعلًا في بياناتك. استخدم مسار تجميع للعثور على المستندات التي تحتوي على مصفوفات كبيرة بشكل غير معتاد. حدّد عتبة تستند إلى النطاق الطبيعي المتوقع؛ فإذا كان 99% من المنشورات يحتوي على أقل من 100 تعليق، فالمستندات التي تحتوي على أكثر من 1,000 تعليق تُعد قيمًا شاذة تستحق معالجة خاصة.
// Find posts with outlier-level comment counts
db.posts.aggregate([
{
$project: {
title: 1,
commentCount: { $size: { $ifNull: ['$comments', []] } }
}
},
{ $match: { commentCount: { $gt: 1000 } } },
{ $sort: { commentCount: -1 } },
{ $limit: 10 }
])نمط القيم الشاذة: علامة التجاوز
يحافظ نمط القيم الشاذة على سرعة الحالة الطبيعية عبر تضمين المصفوفات حتى حد معين، ومعالجة المستندات الاستثنائية بتعيين علامة hasOverflow وتخزين العناصر المتجاوزة في مجموعة منفصلة. يتحقق كود التطبيق من العلامة؛ فإذا كانت false (وهي الحالة الشائعة)، يستخدم المصفوفة المضمّنة. وإذا كانت true (حالة القيمة الشاذة)، ينفذ استعلامًا إضافيًا في مجموعة العناصر المتجاوزة.
// Normal post document (99% of posts)
{ _id: ObjectId(), title: 'Regular Post', comments: [/* up to 100 */], hasOverflow: false }
// Outlier post document
{
_id: ObjectId(),
title: 'Viral Post',
comments: [/* first 100 comments */],
hasOverflow: true // more comments in overflow collection
}
// Overflow collection document
{ postId: ObjectId('...'), comments: [/* comments 101-5000 */] }القراءة باستخدام نمط القيم الشاذة
يجب أن يتعامل كود التطبيق مع علامة القيمة الشاذة بشكل صريح. في معظم الأوقات تكون العلامة false وتكون القراءة سريعة. أما في المستندات ذات القيم الشاذة، فنفّذ استعلامًا إضافيًا لجلب العناصر المتجاوزة. يحافظ ذلك على تحسين المسار الشائع، مع معالجة الحالات الاستثنائية بشكل صحيح دون تضخيم المستندات الطبيعية أو بلوغ حد 16 MB.
async function getPostWithComments(postId) {
const post = await db.collection('posts').findOne({ _id: postId })
if (!post.hasOverflow) {
return post // fast path — all comments embedded
}
// Outlier path — fetch additional comments from overflow
const overflow = await db.collection('postOverflow').findOne({ postId })
return {
...post,
comments: [...post.comments, ...(overflow?.comments ?? [])]
}
}مقدمة إلى أنماط بنية الأشجار
تظهر البيانات الهرمية، مثل فئات المنتجات والمخططات التنظيمية وأنظمة الملفات وسلاسل التعليقات، في كل تطبيق تقريبًا. لا يحتوي MongoDB على نوع بيانات أصلي للأشجار، لذا يجب نمذجة البنية في مخطط المستند. توجد أربعة أنماط شائعة للأشجار، وكل منها محسّن لأنماط وصول مختلفة إلى الاستعلامات: مراجع الأصل، ومراجع الأبناء، ومصفوفة الأسلاف، والمسارات المادية.
مراجع الأصل: تسلسل هرمي بسيط
يخزّن نمط مرجع الأصل كل عقدة مع حقل parent واحد يشير إلى قيمة _id الخاصة بأصلها. تحتوي العقد الجذرية على parent: null. هذا أبسط تمثيل، ويشبه طريقة عمل أشجار المجموعات المتداخلة أو قوائم التجاور في SQL. وهو فعال في العثور على الأصل المباشر لعقدة أو أبنائها المباشرين، لكنه يتطلب استعلامات عودية لاجتياز مستويات متعددة.
// Category tree with Parent References
db.categories.insertMany([
{ _id: 1, name: 'Electronics', parent: null },
{ _id: 2, name: 'Phones', parent: 1 },
{ _id: 3, name: 'Laptops', parent: 1 },
{ _id: 4, name: 'Smartphones', parent: 2 },
{ _id: 5, name: 'Feature Phones',parent: 2 }
])
// Find direct children of 'Electronics'
db.categories.find({ parent: 1 })مصفوفة الأسلاف: بحث سريع عن الأسلاف
يخزّن نمط مصفوفة الأسلاف المسار الكامل من الجذر إلى العقدة الحالية في مصفوفة ancestors. يسهّل ذلك الإجابة عن السؤال «هل X سلف Y؟» عبر فحص بسيط لعضوية المصفوفة. كما يسهّل العثور على جميع أحفاد عقدة ما، وذلك بالاستعلام عن المستندات التي تحتوي مصفوفة ancestors فيها على قيمة _id الخاصة بتلك العقدة. والمقابل هو أن نقل شجرة فرعية يتطلب تحديث جميع مستندات الأحفاد.
// Array of Ancestors pattern
db.categories.insertMany([
{ _id: 1, name: 'Electronics', ancestors: [] },
{ _id: 2, name: 'Phones', ancestors: [1] },
{ _id: 4, name: 'Smartphones', ancestors: [1, 2] } // root→Electronics→Phones
])
// Find all descendants of Electronics (id=1)
db.categories.find({ ancestors: 1 })
// Check if Electronics is an ancestor of Smartphones
db.categories.findOne({ _id: 4, ancestors: 1 }) // not null = yesالمسارات المادية: شجرة قائمة على السلاسل
يخزّن نمط المسار المادي المسار الكامل كسلسلة نصية (مثل '/Electronics/Phones/Smartphones'). يتيح ذلك استخدام استعلامات البادئة للعثور على جميع العقد أسفل شجرة فرعية، واستعلامات التعبيرات النمطية للبحث داخل مقاطع المسار. يناسب هذا النمط مسارات أنظمة الملفات أو التسلسلات الهرمية لعناوين URL بشكل طبيعي. وهو فعال في البحث عن الأسلاف وتعداد الأحفاد، لكنه قد يكون هشًا عند إعادة تسمية العقد أو نقلها.
// Materialised Path pattern
db.categories.insertMany([
{ _id: 1, name: 'Electronics', path: ',1,' },
{ _id: 2, name: 'Phones', path: ',1,2,' },
{ _id: 4, name: 'Smartphones', path: ',1,2,4,' }
])
// Find all descendants of Phones (id=2) — path contains ',2,'
db.categories.find({ path: /,2,/ })
// Find the full path ancestors of Smartphones
db.categories.find({ _id: { $in: [1, 2] } }) // parse path and lookup idsاختيار نمط الشجرة المناسب
اختر نمط الشجرة بناءً على الاستعلام الأكثر تكرارًا لديك: مراجع الأصل — بسيطة، ومناسبة للاجتياز باستخدام العودية في جانب التطبيق؛ مراجع الأبناء — تضمّن مصفوفة الأبناء المباشرين، وسريعة لقراءة مستوى واحد؛ مصفوفة الأسلاف — سريعة للبحث عن الأسلاف والاستعلامات على الأشجار الفرعية، لكنها مكلفة عند النقل؛ المسارات المادية — سريعة للاستعلامات على الأشجار الفرعية باستخدام التعبيرات النمطية، لكنها هشة عند إعادة التسمية. توازن الأساليب الهجينة (تخزين الأصل والأسلاف معًا) بين تعقيد الكتابة وسرعة القراءة.
مراجع الأبناء: تضمين الأبناء المباشرين
يضمّن نمط مراجع الأبناء مصفوفة من قيم _id للأبناء المباشرين في مستند كل عقدة. يتيح ذلك استرداد جميع أبناء العقدة بسرعة من خلال قراءة واحدة، دون الحاجة إلى استعلام منفصل. وهو مثالي للأشجار التي تُقرأ من الأعلى إلى الأسفل بشكل متكرر (مثل عرض قائمة أبنائها مباشرة). والمقابل هو أن مصفوفة الأبناء قد تكبر كثيرًا في العقد العريضة، ولا يمكنك العثور على أصل العقدة بكفاءة دون فهرس أو حقل إضافي.
// Child References pattern
db.categories.insertMany([
{ _id: 1, name: 'Electronics', children: [2, 3] },
{ _id: 2, name: 'Phones', children: [4, 5] },
{ _id: 3, name: 'Laptops', children: [] },
{ _id: 4, name: 'Smartphones', children: [] },
{ _id: 5, name: 'Feature Phones', children: [] }
])
// Get direct children of Electronics in one read
const parent = db.categories.findOne({ _id: 1 })
const children = db.categories.find({ _id: { $in: parent.children } }).toArray()استخدام $graphLookup لاجتياز الشجرة
تتبع مرحلة التجميع $graphLookup في MongoDB حقول المراجع بشكل عودي لاجتياز شجرة أو رسم بياني مخزّن بأي نمط. وتعيد جميع العقد التي يمكن الوصول إليها حتى عمق محدد. استخدمها مع مراجع الأصل أو مراجع الأبناء لاجتياز التسلسلات الهرمية دون كتابة كود تطبيقي عودي. حدّد maxDepth لمنع الحلقات اللانهائية في الرسوم البيانية الدائرية.
// Traverse all descendants of Electronics using $graphLookup
db.categories.aggregate([
{ $match: { _id: 1 } }, // start from Electronics
{
$graphLookup: {
from: 'categories',
startWith: '$_id',
connectFromField: '_id',
connectToField: 'parent',
as: 'descendants',
maxDepth: 10
}
}
])تحقق سريع
اختبر فهمك لمفاهيم MongoDB وقواعد بيانات NoSQL التي تناولها هذا الدرس.
مراجعة الدرس
تعلمت في هذا الدرس أن نمط القيم الشاذة يحافظ على خفة المستندات الطبيعية عبر تضمين المصفوفات حتى حد معين، واستخدام علامة hasOverflow لتوجيه المستندات الاستثنائية إلى مجموعة للعناصر المتجاوزة؛ وأن أنماط بنية الأشجار (مراجع الأصل، ومصفوفة الأسلاف، والمسارات المادية) تحسّن كل منها نمطًا مختلفًا للوصول إلى استعلامات البيانات الهرمية؛ وأن $graphLookup يجتاز المراجع بشكل عودي داخل المسار دون عودية في جانب التطبيق. في الدرس التالي سنقارن بين MongoDB وRedis في أحمال عمل المستندات مقابل أزواج المفتاح والقيمة.
تعلم JavaScript مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 30
- الدروس
- 120
الأسئلة الشائعة
هل درس «نمطا القيم الشاذة وبنية الشجرة» مجاني؟
نعم — نص درس «نمطا القيم الشاذة وبنية الشجرة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة MongoDB Academy، انتقل إلى CoddyKit PRO. تتضمن دورة MongoDB Academy 4 دروس في المجموع.
ماذا ستتعلم في «نمطا القيم الشاذة وبنية الشجرة»؟
سيتعامل المتعلمون مع المستندات التي تحتوي على مصفوفات كبيرة بشكل غير معتاد باستخدام نمط القيم الشاذة، ويمثلون بيانات الأشجار الهرمية باستخدام مراجع الأصل أو المسارات المادية. تتمرن على MongoDB Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ MongoDB Academy؟
لا تُشترط خبرة سابقة. MongoDB Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «نمطا القيم الشاذة وبنية الشجرة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس MongoDB Academy هذا؟
نعم. كل درس في MongoDB Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- نمطا الحاوية والقيم المحسوبة
- نمطا المرجع الموسّع والمجموعة الفرعية
- نمطا تعدد الأشكال وإصدارات المخطط
- نمطا القيم الشاذة وبنية الشجرة