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

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

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

پرس و جوی زیر از فیلترهای محدوده بر روی جمعیت و تراکم استفاده می کند تا همه شهرهایی را که جمعیت آنها بیش از 1,000,000 نفر و تراکم جمعیت کمتر از 10,000 نفر در واحد مساحت است را برگرداند.

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

const q = query(
    collection(db, "cities"),
    where('population', '>', 1000000),
    where('density', '<', 10000),
  );

سویفت

let query = db.collection("cities")
  .whereField("population", isGreaterThan: 1000000)
  .whereField("density", isLessThan: 10000)

هدف-C

FIRQuery *query =
 [[[[self.db collectionWithPath:@"cities"]
queryWhereField:@"population" isGreaterThan:@1000000]
   queryWhereField:@"density" isLessThan:@10000];

جاوا اندروید

Query query = db.collection("cities")
 .whereGreaterThan("population", 1000000)
 .whereLessThan("density", 10000);

Kotlin+KTX اندروید

val query = db.collection("cities")
 .whereGreaterThan("population", 1000000)
 .whereLessThan("density", 10000)

برو

   query := client.Collection("cities").
      Where("population", ">", 1000000).
      Where("density", "<", 10000)

جاوا

db.collection("cities")
  .whereGreaterThan("population", 1000000)
  .whereLessThan("density", 10000);

Node.js

db.collection("cities")
  .where('population', '>', 1000000),
  .where('density', '<', 10000)

پایتون

from google.cloud import firestore

db = firestore.Client()
query = db.collection("cities")
.where("population", ">", 1000000)
.where("density", "<", 10000)

PHP

$collection = $db->collection('samples/php/cities');
$chainedQuery = $collection
    ->where('population', '>', 1000000)
    ->where('density', '<', 10000);

سی شارپ

CollectionReference citiesRef = db.Collection("cities");
Query query = citiesRef
    .WhereGreaterThan("Population", 1000000)
    .WhereLessThan("Density", 10000);
QuerySnapshot querySnapshot = await query.GetSnapshotAsync();
foreach (DocumentSnapshot documentSnapshot in querySnapshot)
{
    var name = documentSnapshot.GetValue<string>("Name");
    var population = documentSnapshot.GetValue<int>("Population");
    var density = documentSnapshot.GetValue<int>("Density");
    Console.WriteLine($"City '{name}' returned by query. Population={population}; Density={density}");
}

روبی

query = cities_ref.where("population", ">", "1000000")
                  .where("density", "<", 10000)

C++

CollectionReference cities_ref = db->Collection("cities");
Query query = cities_ref.WhereGreaterThan("population", FieldValue::Integer(1000000))
                       .WhereLessThan("density", FieldValue::Integer(10000));

وحدت

CollectionReference citiesRef = db.Collection("cities");
Query query = citiesRef.WhereGreaterThan("population", 1000000)
                      .WhereLessThan("density", 10000);

دارت

final citiesRef = FirebaseFirestore.instance.collection('cities')
final query = citiesRef.where("population", isGreaterThan: 1000000)
                  .where("density", isLessThan: 10000);

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

قبل از اجرای جستارهای خود، در مورد کوئری ها و مدل داده 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 محدود می کند. این برای جلوگیری از گران شدن درخواست ها برای اجرا است.

بعدش چی