پرس و جو با فیلترهای محدوده و نابرابری در نمای کلی چند فیلد

Cloud Firestore از فیلترهای محدوده و نابرابری در چندین فیلد در یک پرس و جو پشتیبانی می کند. اکنون می توانید شرایط محدوده و نابرابری را در چندین زمینه داشته باشید و با واگذاری اجرای منطق پس از فیلتر کردن به Cloud Firestore، توسعه برنامه خود را ساده کنید.

فیلترهای محدوده و نابرابری در چندین فیلد

درخواست زیر همه کاربرانی را که سن آنها بیشتر از 35 سال و قد آنها بین 60 تا 70 سال است را با استفاده از فیلترهای محدوده سن و قد برمی گرداند.

وب نسخه 9 ماژولار

  const q = query(
      collection(db, "users"),
      where('age', '>', 35),
      where('height', '>', 60),
      where('height', '<', 70)
    );

سریع

 let query = db.collection("users")
   .whereField("age", isGreaterThan: 35)
   .whereField("height", isGreaterThan: 60)
   .whereField("height", isLessThan: 70)

هدف-C

 FIRQuery *query = 
  [[[[self.db collectionWithPath:@"users"]
 queryWhereField:@"age" isGreaterThan:@35]
    queryWhereField:@"height" isGreaterThan:@60] 
        queryWhereField:@"height" isLessThan:@70];

جاوا اندروید

 Query query = db.collection("users")
  .whereGreaterThan("age", 35)
  .whereGreaterThan("height", 60)
  .whereLessThan("height", 70);

Kotlin+KTX اندروید

 val query = db.collection("users")
  .whereGreaterThan("age", 35)
  .whereGreaterThan("height", 60)
  .whereLessThan("height", 70)

جاوا

  db.collection("users")
    .whereGreaterThan("age", 35)
    .whereGreaterThan("height", 60)
    .whereLessThan("height", 70);

Node.js

db.collection("users")
  .where('age', '>', 35),
  .where('height', '>', 60),
  .where('height', '<', 70)

ملاحظات نمایه سازی

قبل از شروع اجرای پرس و جوهای خود، مطمئن شوید که در مورد کوئری ها و مدل داده Cloud Firestore مطالعه کرده اید.

در Cloud Firestore، بند ORDER BY یک پرس و جو تعیین می کند که کدام شاخص ها می توانند برای ارائه پرس و جو استفاده شوند. به عنوان مثال، یک پرس و جو ORDER BY a ASC, b ASC به یک نمایه ترکیبی در فیلدهای a ASC, b ASC نیاز دارد.

برای بهینه سازی عملکرد و هزینه پرس و جوهای Cloud Firestore، باید ترتیب فیلدها را در فهرست بهینه کنید. برای انجام این کار، باید اطمینان حاصل کنید که فهرست شما از چپ به راست مرتب شده است، به طوری که پرس و جو به مجموعه داده ای تقطیر می شود که از اسکن ورودی های نمایه خارجی جلوگیری می کند.

فرض کنید می خواهید در میان مجموعه ای از کارمندان جستجو کنید و کارمندانی را بیابید که حقوق آنها بیش از 100000 و تعداد سال تجربه آنها بیشتر از 0 است. بر اساس درک شما از مجموعه داده، می دانید که محدودیت حقوق انتخابی تر از محدودیت تجربه شاخص ایده آلی که تعداد اسکن های شاخص را کاهش می دهد (salary [...], experience [...]) خواهد بود. بنابراین، درخواستی که سریع و مقرون به صرفه باشد، salary قبل از experience سفارش می دهد و به صورت زیر است:

جاوا

db.collection("employees")
  .whereGreaterThan("salary", 100000)
  .whereGreaterThan("experience", 0)
  .orderBy("salary")
  .orderBy("experience");

Node.js

db.collection("employees")
  .where("salary", ">", 100000)
  .where("experience", ">", 0)
  .orderBy("salary")
  .orderBy("experience");

پایتون

db.collection("employees")
  .where("salary", ">", 100000)
  .where("experience", ">", 0)
  .order_by("salary")
  .order_by("experience");

بهترین روش ها برای بهینه سازی شاخص ها

هنگام بهینه سازی شاخص ها، به بهترین روش های زیر توجه کنید.

ترتیب فیلدهای فهرست بر اساس برابری ها و به دنبال آن محدوده انتخابی یا فیلد نابرابری

Cloud Firestore از سمت چپ ترین فیلدهای یک شاخص ترکیبی برای برآورده کردن محدودیت های برابری و محدودیت محدوده یا نابرابری، در صورت وجود، در اولین فیلد پرس و جو orderBy() استفاده می کند. این محدودیت‌ها می‌تواند تعداد ورودی‌های فهرستی را که Cloud Firestore اسکن می‌کند، کاهش دهد. Cloud Firestore از فیلدهای باقی‌مانده ایندکس برای برآوردن محدودیت‌های محدوده یا نابرابری پرس و جو استفاده می‌کند. این محدودیت‌ها تعداد ورودی‌های فهرستی را که Cloud Firestore اسکن می‌کند کاهش نمی‌دهد، اما اسناد بی‌همتا را فیلتر می‌کند تا تعداد اسنادی که به مشتریان بازگردانده می‌شوند کاهش یابد.

برای اطلاعات بیشتر در مورد ایجاد شاخص های کارآمد، به تعریف شاخص کامل مراجعه کنید.

ترتیب فیلدها به ترتیب کاهش انتخاب محدودیت پرس و جو

برای اطمینان از اینکه Cloud Firestore شاخص بهینه را برای درخواست شما انتخاب می کند، یک عبارت orderBy() را مشخص کنید که فیلدها را به ترتیب کاهش انتخاب محدودیت پرس و جو ترتیب می دهد. گزینش پذیری بالاتر با زیرمجموعه کوچکتری از اسناد مطابقت دارد، در حالی که گزینش پذیری پایین با زیرمجموعه بزرگتری از اسناد مطابقت دارد. اطمینان حاصل کنید که فیلدهای محدوده یا نابرابری با گزینش پذیری بالاتر را زودتر در ترتیب فهرست نسبت به فیلدهایی با گزینش پذیری کمتر انتخاب کرده اید.

برای به حداقل رساندن تعداد اسنادی که Cloud Firestore از طریق شبکه اسکن می‌کند و برمی‌گرداند، همیشه باید فیلدها را به ترتیب کاهش انتخاب محدودیت پرس و جو ترتیب دهید. اگر مجموعه نتایج به ترتیب مورد نیاز نیست و انتظار می‌رود مجموعه نتایج کوچک باشد، می‌توانید منطق سمت مشتری را برای مرتب کردن مجدد آن مطابق با انتظارات سفارش خود پیاده کنید.

به عنوان مثال، فرض کنید می خواهید در مجموعه ای از کارمندان جستجو کنید تا کارمندانی را پیدا کنید که حقوق آنها بیش از 100000 است و نتایج را بر اساس سال سابقه کارمند سفارش دهید. اگر انتظار دارید تعداد کمی از کارمندان بیش از 100000 حقوق داشته باشند، کارآمدترین راه برای نوشتن پرس و جو به شرح زیر است:

جاوا

db.collection("employees")
  .whereGreaterThan("salary", 100000)
  .orderBy("salary")
  .get()
  .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
        @Override
        public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
          // Order results by `experience`
        }
    });;

Node.js

const querySnapshot = await db.collection('employees')
                              .where("salary", ">", 100000)
                              .orderBy("salary")
                              .get();

// Order results by `experience`

پایتون

results = db.collection("employees")
            .where("salary", ">", 100000)
            .order_by("salary")
            .stream()

// Order results by `experience`

در حالی که افزودن یک سفارش experience به پرس و جو، همان مجموعه اسناد را به همراه خواهد داشت و از ترتیب مجدد نتایج در مشتریان جلوگیری می کند، پرس و جو ممکن است ورودی های فهرست اضافی بیشتری را نسبت به پرس و جو قبلی بخواند. این به این دلیل است که Cloud Firestore همیشه شاخصی را ترجیح می دهد که پیشوند فیلدهای فهرست آن با ترتیب بند پرس و جو مطابقت داشته باشد. اگر experience توسط بند به سفارش اضافه شود، Cloud Firestore شاخص (experience [...], salary [...]) برای محاسبه نتایج پرس و جو انتخاب می کند. از آنجایی که هیچ محدودیت دیگری برای experience وجود ندارد، Cloud Firestore قبل از اعمال فیلتر salary برای یافتن مجموعه نتایج نهایی، تمام ورودی‌های فهرست مجموعه employees را می‌خواند. این بدان معناست که ورودی‌های فهرستی که فیلتر salary را برآورده نمی‌کنند همچنان خوانده می‌شوند، بنابراین تأخیر و هزینه درخواست افزایش می‌یابد.

قیمت گذاری

پرس و جوهایی با فیلترهای محدوده و نابرابری در چندین فیلد بر اساس خواندن اسناد و ورودی های فهرست خوانده می شوند.

برای اطلاعات دقیق، صفحه قیمت را ببینید.

محدودیت ها

جدا از محدودیت‌های پرس و جو ، قبل از استفاده از کوئری‌هایی با فیلترهای محدوده و نابرابری در چندین فیلد، به محدودیت‌های زیر توجه کنید:

  • جستارهای دارای فیلترهای محدوده یا نابرابری در فیلدهای سند و فقط محدودیت‌های برابری در کلید سند (__name__) پشتیبانی نمی‌شوند.
  • Cloud Firestore تعداد محدوده یا فیلدهای نابرابری را به 10 محدود می کند. این برای جلوگیری از گران شدن درخواست ها برای اجرا است.

بعد چه است