MongoDB Academy · درس

انتهاء صلاحية البيانات تلقائيًا باستخدام expireAfterSeconds

سيضبط المتعلمون الخيار expireAfterSeconds في مجموعة سلاسل زمنية لحذف القياسات القديمة تلقائيًا والتحكم في تكاليف التخزين.

الدرس 4 من 413 خطوة

انتهاء صلاحية البيانات تلقائيًا باستخدام expireAfterSeconds درس مجاني في MongoDB Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في MongoDB Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة MongoDB Academy 4 دروس في المجموع.

أهمية انتهاء صلاحية البيانات تلقائيًا

تكون قيمة بيانات السلاسل الزمنية محدودة تقريبًا دائمًا — فنادرًا ما تفيد قراءات المستشعرات التي يعود تاريخها إلى 5 سنوات في قرارات اليوم. ويؤدي الاحتفاظ بالبيانات القديمة إلى إهدار مساحة التخزين، وإبطاء عمليات النسخ الاحتياطي، وزيادة أحجام الفهارس. يتيح لك خيار MongoDB المسمى expireAfterSeconds تحديد فترة الاحتفاظ عند إنشاء المجموعة، بحيث تتولى قاعدة البيانات التنظيف تلقائيًا من دون وظائف cron أو إجراءات حذف على مستوى التطبيق.

تعيين expireAfterSeconds عند الإنشاء

مرّر expireAfterSeconds كخيار على المستوى الأعلى إلى جانب كائن timeseries عند استدعاء db.createCollection(). وتمثل القيمة عددًا صحيحًا يحدد عدد الثواني المطلوب الاحتفاظ بالبيانات خلالها. تصبح المستندات التي تكون قيمة timeField فيها أقدم من الآن − expireAfterSeconds مؤهلة للحذف بواسطة مؤشر ترابط الخلفية الخاص بـ TTL.

// Create a collection that retains data for 30 days
db.createCollection('sensorReadings', {
  timeseries: {
    timeField: 'timestamp',
    metaField: 'sensorId',
    granularity: 'seconds'
  },
  expireAfterSeconds: 60 * 60 * 24 * 30  // 2592000 seconds = 30 days
})

كيفية عمل حذف TTL للسلاسل الزمنية

يعمل مؤشر ترابط TTL في MongoDB كل 60 ثانية تقريبًا. وبالنسبة إلى مجموعات السلاسل الزمنية، يحذف المؤشر مستندات bucket بأكملها بدلًا من القياسات الفردية. ولا يُحذف الـ bucket إلا عندما تكون جميع القياسات التي يحتوي عليها أقدم من حد انتهاء الصلاحية. يجعل ذلك حذف TTL فعالًا جدًا — إذ يؤدي حذف مستند bucket واحد إلى حذف مئات القياسات في عملية واحدة.

تحديث expireAfterSeconds في المجموعات الحالية

يمكنك تعديل فترة الاحتفاظ لمجموعة سلاسل زمنية موجودة في أي وقت باستخدام الأمر collMod — من دون الحاجة إلى إيقاف الخدمة. يؤدي رفع القيمة إلى الاحتفاظ بالبيانات مدة أطول، بينما يؤدي خفضها إلى جعل البيانات التي لم تكن منتهية الصلاحية سابقًا مؤهلة للحذف عند تشغيل TTL التالي. ويسري التغيير خلال نحو 60 ثانية.

// Extend retention from 30 days to 90 days
db.runCommand({
  collMod: 'sensorReadings',
  expireAfterSeconds: 60 * 60 * 24 * 90  // 7776000 seconds
})

// Disable expiration entirely
db.runCommand({
  collMod: 'sensorReadings',
  expireAfterSeconds: 0
})

TTL مقابل فهارس TTL في المجموعات العادية

تستخدم مجموعات MongoDB العادية فهرس TTL (وهو فهرس خاص أحادي الحقل في حقل تاريخ، مع سمة expireAfterSeconds) لانتهاء صلاحية المستندات الفردية. أما مجموعات السلاسل الزمنية فتستخدم آلية مختلفة — إذ تنهي صلاحية مستندات bucket بأكملها بدلًا من مستندات القياسات الفردية. لذلك لا يمكنك إنشاء فهرس TTL منفصل في مجموعة سلاسل زمنية؛ إذ تتم إدارة انتهاء الصلاحية حصريًا عبر خيار المجموعة expireAfterSeconds.

// Regular collection TTL index (NOT for time series)
db.logs.createIndex(
  { createdAt: 1 },
  { expireAfterSeconds: 86400 }  // deletes individual documents after 24h
)

// Time series uses collection-level option, not an index
// (The line below would fail on a time series collection)
// db.sensorReadings.createIndex({ timestamp: 1 }, { expireAfterSeconds: 86400 })

التحقق من إعداد انتهاء الصلاحية

افحص سياسة الاحتفاظ الحالية بتشغيل db.getCollectionInfos() وفحص الحقل options.expireAfterSeconds. ويمكنك أيضًا التحقق من db.sensorReadings.stats()، الذي يعرض إعداد TTL ضمن مخرجاته. ويفيد ذلك أثناء عمليات التدقيق للتأكد من ضبط مجموعات الإنتاج على فترة الاحتفاظ الصحيحة.

// Check collection metadata including TTL
const info = db.getCollectionInfos({ name: 'sensorReadings' })
printjson(info[0].options)
// Output includes: { expireAfterSeconds: 2592000, timeseries: {...} }

// Check via stats
db.sensorReadings.stats()

الاحتفاظ المتدرج باستخدام مجموعات متعددة

من الأنماط الشائعة في بيئات الإنتاج الاحتفاظ المتدرج: تُخزَّن البيانات الخام عالية التواتر في مجموعة سلاسل زمنية واحدة مع TTL قصير (مثل 7 أيام)، بينما تشغّل وظيفة لخط أنابيب التجميع ليلًا لحساب الملخصات الساعية وكتابتها في مجموعة ثانية مع TTL أطول (مثل سنتين). يوازن ذلك بين تكاليف التخزين والحاجة إلى تحليل الاتجاهات التاريخية.

// Raw readings — 7-day retention
db.createCollection('rawReadings', {
  timeseries: { timeField: 'ts', metaField: 'deviceId', granularity: 'seconds' },
  expireAfterSeconds: 60 * 60 * 24 * 7
})

// Hourly summaries — 2-year retention
db.createCollection('hourlyStats', {
  timeseries: { timeField: 'hour', metaField: 'deviceId', granularity: 'hours' },
  expireAfterSeconds: 60 * 60 * 24 * 730
})

توقيت مؤشر ترابط TTL ودقته

يستيقظ مؤشر ترابط TTL في الخلفية كل 60 ثانية، لذلك لا يحدث انتهاء الصلاحية فورًا — فقد تبقى البيانات مدة تصل إلى 60 ثانية بعد تجاوزها الحد المحدد. وفي مجموعات Atlas التي تخضع لحمل مرتفع، قد تتأخر عمليات حذف TTL أكثر من ذلك. أما متطلبات الامتثال التي تفرض حذفًا دقيقًا في ثانية محددة، فتكون نصوص الحذف اليدوية أو Atlas Triggers المجدولة أكثر تحكمًا وتحديدًا من TTL.

الحذف اليدوي للتنظيف الفوري

إذا احتجت إلى إزالة مجموعة من القياسات فورًا — مثلًا لتطهير بيانات مستشعر معيب — فاستخدم deleteMany() مع مرشح يعتمد على timeField وmetaField. تدعم مجموعات السلاسل الزمنية عمليات الحذف حسب النطاق الزمني وقيمة metaField منذ MongoDB 5.1. أما المرشحات المعقدة التي تعتمد على حقول القياس في عمليات الحذف، فتُدعم منذ MongoDB 6.0.

// Delete all readings from a broken sensor before a cutoff date
db.sensorReadings.deleteMany({
  sensorId: 'sensor-broken-99',
  timestamp: { $lt: new Date('2024-06-01T00:00:00Z') }
})

// Delete readings older than a specific date for all sensors
db.sensorReadings.deleteMany({
  timestamp: { $lt: new Date('2023-01-01T00:00:00Z') }
})

مراقبة حذف البيانات المنتهية الصلاحية

تعرض MongoDB مقاييس حذف TTL في حالة الخادم ضمن القسم metrics.ttl. ويتتبع العداد deletedDocuments عدد المستندات (مستندات bucket في السلاسل الزمنية) التي حذفها مؤشر ترابط TTL منذ بدء عملية mongod. تساعدك مراقبة هذا العداد على التأكد من أن TTL يعمل ويحذف البيانات كما هو متوقع في بيئة الإنتاج.

// Check TTL deletion metrics in mongosh
const status = db.serverStatus()
printjson(status.metrics.ttl)
// Output:
// {
//   deletedDocuments: NumberLong(12345),
//   passes: NumberLong(500)
// }

أفضل ممارسات التخطيط للاحتفاظ

عند التخطيط للاحتفاظ بالبيانات، ضع في اعتبارك ثلاثة عوامل: متطلبات الامتثال (إذ تفرض بعض اللوائح الاحتفاظ بالبيانات لسنوات)، والاحتياجات التحليلية (إلى أي مدى زمني تمتد استعلاماتك؟)، وميزانية التخزين (ما تكلفة الاحتفاظ ببيانات N يومًا؟). نمذِج نمو التخزين من خلال تقدير حجم المستندات اليومي × متوسط حجم المستند، ثم اضبط expireAfterSeconds لتحقيق التوازن بين القيود الثلاثة.

// Storage estimation helper
const docsPerDay = 60 * 60 * 24       // one reading per second = 86400
const avgDocBytes = 150                // approximate compressed document size
const retentionDays = 30
const totalBytes = docsPerDay * avgDocBytes * retentionDays
console.log('Estimated storage:', (totalBytes / 1e9).toFixed(2), 'GB')
// Outputs: Estimated storage: 0.37 GB for one sensor, 30 days

تحقق سريع

اختبر مدى فهمك لمفاهيم MongoDB وقواعد بيانات NoSQL التي تناولها هذا الدرس.

مراجعة الدرس

تعلمت في هذا الدرس أن expireAfterSeconds يُعيَّن على مستوى المجموعة (وليس عبر فهرس) ويتحكم في وقت حذف الـ buckets بأكملها، وأن collMod يتيح لك تحديث فترة الاحتفاظ في مجموعة قيد التشغيل من دون توقف، وأن الاحتفاظ المتدرج — TTL قصير للبيانات الخام وTTL طويل للملخصات المجمعة مسبقًا — هو أفضل ممارسة في الإنتاج لتخزين السلاسل الزمنية بتكلفة فعالة. بعد ذلك سنتناول آليات المصادقة في MongoDB.

البدء مجانًا

تعلم JavaScript مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
30
الدروس
120

الأسئلة الشائعة

هل درس «انتهاء صلاحية البيانات تلقائيًا باستخدام expireAfterSeconds» مجاني؟

نعم — نص درس «انتهاء صلاحية البيانات تلقائيًا باستخدام expireAfterSeconds» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة MongoDB Academy، انتقل إلى CoddyKit PRO. تتضمن دورة MongoDB Academy 4 دروس في المجموع.

ماذا ستتعلم في «انتهاء صلاحية البيانات تلقائيًا باستخدام expireAfterSeconds»؟

سيضبط المتعلمون الخيار expireAfterSeconds في مجموعة سلاسل زمنية لحذف القياسات القديمة تلقائيًا والتحكم في تكاليف التخزين. تتمرن على MongoDB Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ MongoDB Academy؟

لا تُشترط خبرة سابقة. MongoDB Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «انتهاء صلاحية البيانات تلقائيًا باستخدام expireAfterSeconds»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس MongoDB Academy هذا؟

نعم. كل درس في MongoDB Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. إنشاء مجموعة سلاسل زمنية
  2. إدراج بيانات السلاسل الزمنية والاستعلام عنها
  3. تجميعات النوافذ على السلاسل الزمنية
  4. انتهاء صلاحية البيانات تلقائيًا باستخدام expireAfterSeconds
← العودة إلى MongoDB Academy