اذهب إلى المحتوى

السؤال

نشر

تفقدت كود خاص بمشروع Next.js لكن لم أفهم الجزء الخاص بالـ Pagination وهو التالي:

schema.statics.paginate = async function ({
    limit = 10, page = 1, sort = -1, where = {}
}) {
    const skip = limit * (page - 1)
    const items = await this.find({ ...where, parent: null })
        .limit(limit)
        .skip(skip)
        .sort({ createdAt: sort })
        .populate('user', 'name')
        .populate('tags', 'name slug')
        .exec()

    const pages = Math.ceil(await this.count({ ...where, parent: null }).exec() / limit)

    return {
        items, pages
    }

}

أريد توضيح بشكل مفصل ومنطقي وليس شرح للأكواد فقط، ما الذي يحدث هنا، وهل هناك طريقة أسهل أو طريقة أفضل؟

بمعنى توضيح لكي أتمكن من إضافة ميزة الـ Pagination بعد ذلك بمفردي، وشكرًا لكم.

Recommended Posts

  • 0
نشر
schema.statics.paginate = async function ({
    limit = 10, page = 1, sort = -1, where = {}
}) {
    // حساب عدد العناصر التي يجب تخطيها استنادًا إلى الصفحة الحالية والحد (أقصد عدد)
    const skip = limit * (page - 1);

//	يتم استعمال الدالة التالية لاسترجاع العناصر من قاعدة البيانات //
//حيث where تحتوي على الشروط مثل السعر
  
    const items = await this.find({ ...where, parent: null })
        .limit(limit) // حدد عدد الوثائق المُرجعة في كل صفحة
        .skip(skip) // تخطي الوثائق استنادًا إلى القيمة المحسوبة للتخطي
        .sort({ createdAt: sort }) // فرز الوثائق استنادًا إلى حقل 'createdAt'
        .populate('user', 'name') // ملء الحقل 'user' بخاصية 'name'
        .populate('tags', 'name slug') // ملء الحقل 'tags' بخصائص 'name' و 'slug'
        .exec(); // تنفيذ الاستعلام

    // حساب العدد الإجمالي للصفحات استنادًا إلى إجمالي عدد الوثائق
    const pages = Math.ceil(await this.count({ ...where, parent: null }).exec() / limit);

    // إرجاع كائن يحتوي على الوثائق المُرجعة للصفحة الحالية والعدد الإجمالي للصفحات
    return {
        items, // الوثائق المُرجعة للصفحة الحالية
        pages // العدد الإجمالي للصفحات
    };
};

حتى تقوم بعملية الpaginate تحتاج الى معرفة عم عدد العناصر التي سوف تتخطاها و كم عدد العنصر في كل صفحة 
عدد العناصر التي سوف تتخطاها هو الskip و هو معرف داخل الfunction و يتم حسابة باستخدام الpage و الlimit كما هو موضح 
عدد العناصر في الصفحة الواحدة هو الlimit 

نلاحظ أيضا استعمال function بطريقة الfunction definition حتا تعمل كلمة this بدورها و تكون عائدة على الموديل نفسة و هو في حالتنا schema.statics
_
مثلا لنفترض وجود 10 عناصر في كل صفحة 
اذا في الصفحة الأولى نريد تفويد عدد 0 منم العناصر و احضار 10 => skip=0 , limit =10
الصفحة الثانية نريد تفويت 10 و احضار 10 => skip=10 , limit=10
و هكذا

  • 0
نشر

الكود الخاص بك يقوم بتعريف تابع paginate في ال schema الخاصة ب mongoose.
تقوم هذه الدالة بجلب قائمة مرقمة من الملفات documents الموجودة داخل ال collection الخاص بك في قاعدة البيانات mongo db، وذلك بناء على ال parameters.
ال parameters هي:

  • limit: عدد العناصر التي سيتم جلبا في الصفحة (ال default هو 10)

  • page: رقم الصفحة التي سيتم جلبها، (ال default هو 1)

  • sort: الترتيب، حيث 1 هي للتصاعدي، و -1 هي للتنازلي (ال default هو -1)

  • where: الشرط الذي سيطبق عند جلب البيانات.

بناء على هذه المتغيرات، يقوم التابع باعادة العناصر التي تم جلبها من قاعدة البيانات بعد ترقيمها، والعدد الاجمالي للصفحات.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...