Mohammad Jawad Barati
Mohammad Jawad Barati
خواندن ۱ دقیقه·۴ سال پیش

مانگو‌دی‌بی و TTL

وفتی میخوای یه داکیمنتی بعد از یه مدتی به صورت خودکار حذف بشه بهترین کار اینه که از Time Ti Live خود مانگو استفاده بکنی. چند روش داری برای اینکار که در ادامه بهش پرداخته میشه.

همونطوری که تو عکس میبینید این موضوع یه بخش کوچیک از یه مبحث بزرگ هست :)
همونطوری که تو عکس میبینید این موضوع یه بخش کوچیک از یه مبحث بزرگ هست :)

مشخص کردن expires در mongoose

وقتی داری schema رو تعریف میکنی بگی هر داکیومنتی که ایجاد میشه بعد از n ثانیه حذف بشه. خیلی راحت این موضوع رو میتونی روی createdAt سوار بکنی:

const mongoose = require('mongoose'); const { Schema } = require('mongoose'); const EXPIRES_AFTER_SECONDS = process.env.TOKEN_EXPIRES_AFTER_SECOND; console.log(EXPIRES_AFTER_SECONDS); // 86400 const tokenSchema = new Schema({ type: String, token: Object, userId: String, createdAt: { type: Date, default: Date.now(), expires: EXPIRES_AFTER_SECONDS }, }, { timestamps: { updatedAt: 'updatedAt' } }); module.exports = mongoose.model('tokens', tokenSchema);

ولی مشکلی که برای من پیش اومد این بود که بعد از یه دقیقه (به جای یه روز) داکیومنت رو پاک می‌کرد. برای اینکه بفهمم چه مشکلی وجو داره رفتم سراغ ترمینال و دستور mongo رو اجرا کردم. وقتی واردش شدم مثل تصویر زیر رفتم جلو:

همونطوری که می‌بینید expiresAfterSeconds برای createdAt ساخته شده ولی زمانش ۸۶ ثانیه هست! در حالی که من توی .env مقدارش رو ۸۶۴۰۰ ست کردم. چرا؟ چونکه وقتی از process.env استفاده می‌کنی باید اونو تبدیل به عدد بکنیش:

expires: Number.parseInt(EXPIRES_AFTER_SECONDS)

همین موضوع ساده یک روز منو با خودش درگیر کرده بود.

mongoosemongodbindexingttlnode js
برنانه نویس، مدرس، محقق. عاشق انیمه هستم و دنبال چالش ها جدید.
شاید از این پست‌ها خوشتان بیاید