مرتب‌سازی و محدود کردن داده‌ها با Cloud Firestore

Cloud Firestore عملکرد پُرسمان قدرتمندی را برای مشخص کردن اینکه کدام اسناد را می‌خواهید از مجموعه بازیابی کنید ارائه می‌دهد. این پُرسمان‌ها را می‌توان با get() یا addSnapshotListener() نیز استفاده کرد، همان‌طور که در دریافت داده شرح داده شده است.

داده‌های سفارش و محدودیت

به‌طور پیش‌فرض، پُرسمان همه اسنادی را که پُرسمان را برآورده می‌کنند به‌ترتیب صعودی براساس شناسه سند بازیابی می‌کند. می‌توانید ترتیب مرتب‌سازی داده‌هایتان را بااستفاده از orderBy() مشخص کنید و می‌توانید تعداد اسناد بازیابی‌شده را بااستفاده از limit() محدود کنید. اگر limit() را مشخص کنید، مقدار باید بزرگ‌تر یا مساوی صفر باشد.

برای مثال، می‌توانید ۳ شهر اول را به‌ترتیب حروف الفبا با این عبارت پُرسمان کنید:

Web

import { query, orderBy, limit } from "firebase/firestore";  

const q = query(citiesRef, orderBy("name"), limit(3));

Web

citiesRef.orderBy("name").limit(3);
Swift
توجه: این محصول در watchOS و App Clip دردسترس نیست.
citiesRef.order(by: "name").limit(to: 3)
Objective-C
توجه: این محصول در watchOS و App Clip دردسترس نیست.
[[citiesRef queryOrderedByField:@"name"] queryLimitedTo:3];

Kotlin

citiesRef.orderBy("name").limit(3)

Java

citiesRef.orderBy("name").limit(3);

Dart

final citiesRef = db.collection("cities");
citiesRef.orderBy("name").limit(3);
جاوا
Query query = cities.orderBy("name").limit(3);
Query query = cities.orderBy("name").limitToLast(3);
پایتون
cities_ref = db.collection("cities")
query = cities_ref.order_by("name").limit_to_last(2)
results = query.get()

Python

cities_ref = db.collection("cities")
query = cities_ref.order_by("name").limit_to_last(2)
results = await query.get()
C++‎
cities_ref.OrderBy("name").Limit(3);
Node.js
const firstThreeRes = await citiesRef.orderBy('name').limit(3).get();
رفتن
query := cities.OrderBy("name", firestore.Asc).Limit(3)
query := cities.OrderBy("name", firestore.Asc).LimitToLast(3)
PHP

PHP

برای اصالت‌سنجی در Cloud Firestore، «اطلاعات اعتباری پیش‌فرض برنامه» را راه‌اندازی کنید. برای اطلاعات بیشتر، به راه‌اندازی اصالت‌سنجی برای محیط توسعه محلی مراجعه کنید.

$query = $citiesRef->orderBy('name')->limit(3);
Unity
Query query = citiesRef.OrderBy("Name").Limit(3);
سی شارپ
Query query = citiesRef.OrderBy("Name").Limit(3);
Ruby
query = cities_ref.order("name").limit(3)

همچنین می‌توانید به‌ترتیب نزولی مرتب کنید تا آخرین ۳ شهر را دریافت کنید:

Web

import { query, orderBy, limit } from "firebase/firestore";  

const q = query(citiesRef, orderBy("name", "desc"), limit(3));

Web

citiesRef.orderBy("name", "desc").limit(3);
Swift
توجه: این محصول در watchOS و App Clip دردسترس نیست.
citiesRef.order(by: "name", descending: true).limit(to: 3)
Objective-C
توجه: این محصول در watchOS و App Clip دردسترس نیست.
[[citiesRef queryOrderedByField:@"name" descending:YES] queryLimitedTo:3];

Kotlin

citiesRef.orderBy("name", Query.Direction.DESCENDING).limit(3)

Java

citiesRef.orderBy("name", Direction.DESCENDING).limit(3);

Dart

final citiesRef = db.collection("cities");
citiesRef.orderBy("name", descending: true).limit(3);
جاوا
Query query = cities.orderBy("name", Direction.DESCENDING).limit(3);
پایتون
cities_ref = db.collection("cities")
query = cities_ref.order_by("name", direction=firestore.Query.DESCENDING).limit(3)
results = query.stream()

Python

cities_ref = db.collection("cities")
query = cities_ref.order_by("name", direction=firestore.Query.DESCENDING).limit(3)
results = query.stream()
C++‎
cities_ref.OrderBy("name", Query::Direction::kDescending).Limit(3);
Node.js
const lastThreeRes = await citiesRef.orderBy('name', 'desc').limit(3).get();
رفتن
query := cities.OrderBy("name", firestore.Desc).Limit(3)
PHP

PHP

برای اصالت‌سنجی در Cloud Firestore، «اطلاعات اعتباری پیش‌فرض برنامه» را راه‌اندازی کنید. برای اطلاعات بیشتر، به راه‌اندازی اصالت‌سنجی برای محیط توسعه محلی مراجعه کنید.

$query = $citiesRef->orderBy('name', 'DESC')->limit(3);
Unity
Query query = citiesRef.OrderByDescending("Name").Limit(3);
سی شارپ
Query query = citiesRef.OrderByDescending("Name").Limit(3);
Ruby
query = cities_ref.order("name", "desc").limit(3)

همچنین می‌توانید براساس چندین فیلد سفارش دهید. برای مثال، اگر می‌خواهید براساس ایالت مرتب کنید، و در هر ایالت براساس جمعیت به ترتیب نزولی مرتب کنید:

Web

import { query, orderBy } from "firebase/firestore";  

const q = query(citiesRef, orderBy("state"), orderBy("population", "desc"));

Web

citiesRef.orderBy("state").orderBy("population", "desc");
Swift
توجه: این محصول در watchOS و App Clip دردسترس نیست.
citiesRef
  .order(by: "state")
  .order(by: "population", descending: true)
Objective-C
توجه: این محصول در watchOS و App Clip دردسترس نیست.
[[citiesRef queryOrderedByField:@"state"] queryOrderedByField:@"population" descending:YES];

Kotlin

citiesRef.orderBy("state").orderBy("population", Query.Direction.DESCENDING)

Java

citiesRef.orderBy("state").orderBy("population", Direction.DESCENDING);

Dart

final citiesRef = db.collection("cities");
citiesRef.orderBy("state").orderBy("population", descending: true);
جاوا
Query query = cities.orderBy("state").orderBy("population", Direction.DESCENDING);
پایتون
cities_ref = db.collection("cities")
ordered_city_ref = cities_ref.order_by("state").order_by(
    "population", direction=firestore.Query.DESCENDING
)

Python

cities_ref = db.collection("cities")
cities_ref.order_by("state").order_by(
    "population", direction=firestore.Query.DESCENDING
)
C++‎
cities_ref.OrderBy("state").OrderBy("name", Query::Direction::kDescending);
Node.js
const byStateByPopRes = await citiesRef.orderBy('state').orderBy('population', 'desc').get();
رفتن
query := client.Collection("cities").OrderBy("state", firestore.Asc).OrderBy("population", firestore.Desc)
PHP

PHP

برای اصالت‌سنجی در Cloud Firestore، «اطلاعات اعتباری پیش‌فرض برنامه» را راه‌اندازی کنید. برای اطلاعات بیشتر، به راه‌اندازی اصالت‌سنجی برای محیط توسعه محلی مراجعه کنید.

$query = $citiesRef->orderBy('state')->orderBy('population', 'DESC');
Unity
Query query = citiesRef.OrderBy("State").OrderByDescending("Population");
سی شارپ
Query query = citiesRef.OrderBy("State").OrderByDescending("Population");
Ruby
query = cities_ref.order("state").order("population", "desc")

می‌توانید فیلترهای where() را با orderBy() و limit() ترکیب کنید. در مثال زیر، پُرسمان‌ها آستانه جمعیت را تعریف می‌کنند، براساس جمعیت به‌ترتیب صعودی مرتب می‌کنند، و فقط چند نتیجه اول را که از آستانه فراتر می‌روند برمی‌گردانند:

Web

import { query, where, orderBy, limit } from "firebase/firestore";  

const q = query(citiesRef, where("population", ">", 100000), orderBy("population"), limit(2));

Web

citiesRef.where("population", ">", 100000).orderBy("population").limit(2);
Swift
توجه: این محصول در watchOS و App Clip دردسترس نیست.
citiesRef
  .whereField("population", isGreaterThan: 100000)
  .order(by: "population")
  .limit(to: 2)
Objective-C
توجه: این محصول در watchOS و App Clip دردسترس نیست.
[[[citiesRef queryWhereField:@"population" isGreaterThan:@100000]
    queryOrderedByField:@"population"]
    queryLimitedTo:2];

Kotlin

citiesRef.whereGreaterThan("population", 100000).orderBy("population").limit(2)

Java

citiesRef.whereGreaterThan("population", 100000).orderBy("population").limit(2);

Dart

final citiesRef = db.collection("cities");
citiesRef
    .where("population", isGreaterThan: 100000)
    .orderBy("population")
    .limit(2);
جاوا
Query query = cities.whereGreaterThan("population", 2500000L).orderBy("population").limit(2);
پایتون
cities_ref = db.collection("cities")
query = (
    cities_ref.where(filter=FieldFilter("population", ">", 2500000))
    .order_by("population")
    .limit(2)
)
results = query.stream()

Python

cities_ref = db.collection("cities")
query = (
    cities_ref.where(filter=FieldFilter("population", ">", 2500000))
    .order_by("population")
    .limit(2)
)
results = query.stream()
C++‎
cities_ref.WhereGreaterThan("population", FieldValue::Integer(100000))
    .OrderBy("population")
    .Limit(2);
Node.js
const biggestRes = await citiesRef.where('population', '>', 2500000)
  .orderBy('population').limit(2).get();
رفتن
query := cities.Where("population", ">", 2500000).OrderBy("population", firestore.Desc).Limit(2)
PHP

PHP

برای اصالت‌سنجی در Cloud Firestore، «اطلاعات اعتباری پیش‌فرض برنامه» را راه‌اندازی کنید. برای اطلاعات بیشتر، به راه‌اندازی اصالت‌سنجی برای محیط توسعه محلی مراجعه کنید.

$query = $citiesRef
    ->where('population', '>', 2500000)
    ->orderBy('population')
    ->limit(2);
Unity
Query query = citiesRef
    .WhereGreaterThan("Population", 2500000)
    .OrderBy("Population")
    .Limit(2);
سی شارپ
Query query = citiesRef
    .WhereGreaterThan("Population", 2500000)
    .OrderBy("Population")
    .Limit(2);
Ruby
query = cities_ref.where("population", ">", 2_500_000).order("population").limit(2)

بااین‌حال، اگر فیلتری با مقایسه محدوده (<، <=، >، >=) دارید، اولین ترتیب شما باید در همان فیلد باشد، فهرست orderBy() محدودیت‌های زیر را ببینید.

محدودیت‌ها

به محدودیت زیر برای بندهای orderBy() توجه کنید:

orderBy و وجود

وقتی پُرسمانی را براساس فیلد خاصی مرتب می‌کنید، پُرسمان فقط می‌تواند اسنادی را برگرداند که فیلد مرتب‌سازی در آن‌ها وجود دارد.

برای مثال، پُرسمان زیر هیچ سندی را که فیلد population در آن تنظیم نشده باشد برنمی‌گرداند، حتی اگر آن سندها فیلترهای پُرسمان را برآورده کنند.

جاوا
db.collection("cities").whereEqualTo("country", “USA”).orderBy(“population”);

تأثیر مرتبطی بر نابرابری‌ها اعمال می‌شود. پُرسمان با فیلتر نابرابری در فیلد همچنین به‌معنای مرتب‌سازی براساس آن فیلد است. پرس‌وجو زیر اسناد بدون فیلد population را برنمی‌گرداند، حتی اگر country = USA در آن سند باشد . به‌عنوان راه‌حل، می‌توانید پرس‌وجوهای جداگانه‌ای برای هر ترتیب اجرا کنید یا می‌توانید مقداری را برای همه فیلدهایی که براساس آن‌ها ترتیب می‌دهید اختصاص دهید.

جاوا
db.collection(“cities”).where(or(“country”, USA”), greaterThan(“population”, 250000));

پُرسمان بالا شامل یک order-by ضمنی روی نابرابری است و معادل موارد زیر است:

جاوا
db.collection(“cities”).where(or(“country”, USA”), greaterThan(“population”, 250000)).orderBy(“population”);