شارك المقالة

التحقق من وجود Collection في Firestore باستخدام limit(1)، وفهم الفرق بين المجموعة الخالية والمستند الأب وحدود صلاحيات القراءة.

المجموعة لا تحمل exists مثل المستند

لا يوفر CollectionReference فحص وجود مطابقًا لـ DocumentSnapshot.exists. يمكن الاستعلام عن مستند واحد لمعرفة هل توجد نتيجة قابلة للقراءة. المجموعة التي لا تحتوي مستندات لا تظهر ككيان مستقل يحتفظ بمعلومات وجود؛ لذلك فالمعنى العملي هنا هل يحتوي هذا المسار عناصر، وليس هل سبق أن أنشأ شخص اسم المجموعة. لا تخلط ذلك بفحص مستند users/{id} المعروف المعرف.

لماذا limit(1)؟

قراءة المجموعة كاملة ثم فحص docs.isEmpty تهدر نقل البيانات عندما تحتاج جوابًا منطقيًا فقط. limit(1) يقيد النتائج إلى مستند واحد، لكنه لا يجعل العملية مجانية أو يلغي أثر القواعد والفهارس. إذا كان السؤال عن عنوان مستخدم محدد، استعلم داخل المسار الفرعي لذلك المستخدم بدل البحث في جميع العناوين. تحقق من uid الفارغ وتجنب بناء مسار من إدخال غير موثق دون صلاحيات مناسبة.

النتائج والقواعد والتخزين المحلي

الاستعلام الخالي الناجح يختلف عن استثناء. لا تحول رفض الصلاحية إلى رسالة لا توجد بيانات ولا تطلب فتح القواعد للعالم لعلاجها. Firestore يقيم صلاحية الاستعلام، ولا يعيد لك تلقائيًا فقط المستندات التي يسمح بها من مجموعة لا يجوز قراءتها كلها. إذا أضفت شرط ownerId فاحرص على توافق القواعد والاستعلام. راعِ أن القراءة قد تعتمد على cache وفق سياسة المصدر التي اخترتها.

حدود الاستنتاج واختبار التنفيذ

وجود subcollection لا يستلزم وجود مستند الأب، وحذف مستند لا يعني بالضرورة حذف مستنداته الفرعية. لا تستخدم جواب هذا الفحص لإجراء حذف أو إنشاء حساس دون تحقق مناسب في العملية نفسها. اختبر المسار الخالي ثم أضف عنصرًا وأعد الفحص، وجرب UID مختلفًا وقواعد تمنع القراءة. المثال لا يحصي كل العناصر ولا يعرضها؛ عند الحاجة للعرض انتقل إلى الدفعات المحدودة أو pagination.

المثال التطبيقي وحدوده

أضف الحزم المستوردة بإصدارات متوافقة، وهيئ Firebase قبل استخدام خدماته. المقطع يوضح الجزء المذكور في الشرح؛ إعدادات المنصة والقواعد وواجهة الحالات تظل مسؤولية المشروع المستضيف.

import 'package:cloud_firestore/cloud_firestore.dart';

Future<bool> hasUserAddresses(String uid) async {
  if (uid.isEmpty || uid.contains('/')) throw ArgumentError.value(uid, 'uid');
  final result = await FirebaseFirestore.instance.collection('users').doc(uid)
      .collection('my_address').limit(1).get();
  return result.docs.isNotEmpty;
}

الصور والفيديو من الشرح

المواد المرئية الأصلية محفوظة للرجوع إليها. قد تعرض إصدارًا قديمًا؛ عند الاختلاف اتبع النص والأمثلة المصححة أعلاه، خاصة في خدمات الإشعارات والروابط التي تغيرت.

check flutter collection

مراجع التنفيذ

شاهد أيضًا
مقالات ذات صلة
🚫 مانع الإعلانات مفعل

يجب إيقاف مانع الإعلانات لاستكمال تصفح الموقع