Firebase & Supabase • المستوى الأول • الدرس 4
العودة لفهرس المستوىالتصفية المتقدمة والاستعلامات (query, where & orderBy)
أهداف الدرس العلمية
- بناء الاستعلامات الفعالة بـ
queryوالشرطwhere. - ترتيب النتائج بـ
orderByوالحد من عدد السجلات بـlimit. - دمج عدة شروط معاً (Compound Queries) باستخدام
whereمتعددة. - تطبيق Pagination عبر
startAfterلجلب الصفحات التالية.
1. استعلامات Firestore المركبة
تسمح دالة query بربط عدة شروط معاً، مع مراعاة إنشاء الفهارس المركبة (Composite Indexes) تلقائياً عند الجمع بين where و orderBy على حقول مختلفة.
javascript
// بناء استعلام متدرج خطوة بخطوة
const q = query(
collection(db, "products"), // المجموعة
where("status", "==", "active"), // الشرط الأول
where("price", ">=", 100), // الشرط الثاني
orderBy("createdAt", "desc"), // الترتيب
limit(10) // الحد الأقصى
);
const snapshot = await getDocs(q);
const results = snapshot.docs.map(d => ({ id: d.id, ...d.data() }));2. عوامل المقارنة (Where Operators)
المقارنة الأساسية
==— يساوي!=— لا يساوي>— أكبر من>=— أكبر أو يساوي<— أصغر من<=— أصغر أو يساوي
العمليات المتقدمة
in— قيمة داخل مصفوفةnot-in— قيمة خارج مصفوفةarray-contains— يحوي عنصراًarray-contains-any— يحوي أي عنصر
3. Pagination — جلب الصفحات التالية
1. الصفحة الأولى
const q1 = query( collection(db, 'products'), limit(5) );
2. آخر مستند
const lastDoc = snapshot.docs[snapshot.docs.length - 1];
3. الصفحة التالية
const q2 = query( collection(db, 'products'), startAfter(lastDoc), limit(5) );
التطبيق العملي المباشر
تحدي الدرس الرابع: بناء استعلامات متقدمة
قم بالتعديل على الكود بداخل المحرر أدناه لتطبيق المتطلبات التالية:
- غيّر قيمة
limitفي الدالة الأصلية إلى10(بدل 5). - أنشئ دالة
getProductsByPriceRange(minPrice, maxPrice)مع شرطيwhereلفلترة السعر. - أنشئ دالة
getProductsByCategories(categoryIds)تستخدم عاملwhere("categoryId", "in", categoryIds). - أنشئ دالة
getFeaturedInStock()بـwhere("featured", "==", true)وwhere("stock", ">", 0). - أضف
startAfterإلى imports وأنشئ دالةgetNextPage(lastDocSnapshot). - اضغط "تشغيل الكود" لرؤية نتائج الاستعلامات.
⏳ جارٍ تحميل المحرر التفاعلي...