Check out what’s new from Firebase at Google I/O 2022. Learn more

طلب البيانات والحد منها باستخدام Cloud Firestore

يوفر Cloud Firestore وظائف استعلام قوية لتحديد المستندات التي تريد استردادها من مجموعة. يمكن أيضًا استخدام هذه الاستعلامات مع get() أو addSnapshotListener() ، كما هو موضح في Get Data .

طلب البيانات والحد منها

بشكل افتراضي ، يقوم الاستعلام باسترداد جميع المستندات التي تلبي الاستعلام بترتيب تصاعدي حسب معرف المستند. يمكنك تحديد ترتيب الفرز لبياناتك باستخدام orderBy() ، ويمكنك تحديد عدد المستندات المستردة باستخدام limit() .

على سبيل المثال ، يمكنك الاستعلام عن أول 3 مدن أبجديًا باستخدام:

Web version 9

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

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

Web version 8

citiesRef.orderBy("name").limit(3);
سويفت
ملاحظة: هذا المنتج غير متوفر على أهداف watchOS و App Clip.
citiesRef.order(by: "name").limit(to: 3)
ج موضوعية
ملاحظة: هذا المنتج غير متوفر على أهداف watchOS و App Clip.
[[citiesRef queryOrderedByField:@"name"] queryLimitedTo:3];

Java

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

Kotlin+KTX

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()
سي ++
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)
بي أتش بي
$query = $citiesRef->orderBy('name')->limit(3);
وحدة
Query query = citiesRef.OrderBy("Name").Limit(3);
سي #
Query query = citiesRef.OrderBy("Name").Limit(3);
روبي
query = cities_ref.order("name").limit(3)

يمكنك أيضًا الفرز بترتيب تنازلي للحصول على آخر 3 مدن:

Web version 9

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

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

Web version 8

citiesRef.orderBy("name", "desc").limit(3);
سويفت
ملاحظة: هذا المنتج غير متوفر على أهداف watchOS و App Clip.
citiesRef.order(by: "name", descending: true).limit(to: 3)
ج موضوعية
ملاحظة: هذا المنتج غير متوفر على أهداف watchOS و App Clip.
[[citiesRef queryOrderedByField:@"name" descending:YES] queryLimitedTo:3];

Java

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

Kotlin+KTX

citiesRef.orderBy("name", Query.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(u'cities')
query = cities_ref.order_by(
    u'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()
سي ++
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)
بي أتش بي
$query = $citiesRef->orderBy('name', 'DESC')->limit(3);
وحدة
Query query = citiesRef.OrderByDescending("Name").Limit(3);
سي #
Query query = citiesRef.OrderByDescending("Name").Limit(3);
روبي
query = cities_ref.order("name", "desc").limit(3)

يمكنك أيضًا الطلب من خلال حقول متعددة. على سبيل المثال ، إذا كنت تريد الترتيب حسب الولاية ، وداخل كل ولاية حسب عدد السكان بترتيب تنازلي:

Web version 9

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

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

Web version 8

citiesRef.orderBy("state").orderBy("population", "desc");
سويفت
ملاحظة: هذا المنتج غير متوفر على أهداف watchOS و App Clip.
citiesRef
    .order(by: "state")
    .order(by: "population", descending: true)
ج موضوعية
ملاحظة: هذا المنتج غير متوفر على أهداف watchOS و App Clip.
[[citiesRef queryOrderedByField:@"state"] queryOrderedByField:@"population" descending:YES];

Java

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

Kotlin+KTX

citiesRef.orderBy("state").orderBy("population", Query.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(u'cities')
cities_ref.order_by(u'state').order_by(
    u'population', direction=firestore.Query.DESCENDING)

Python

cities_ref = db.collection("cities")
cities_ref.order_by("state").order_by(
    "population", direction=firestore.Query.DESCENDING
)
سي ++
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)
بي أتش بي
$query = $citiesRef->orderBy('state')->orderBy('population', 'DESC');
وحدة
Query query = citiesRef.OrderBy("State").OrderByDescending("Population");
سي #
Query query = citiesRef.OrderBy("State").OrderByDescending("Population");
روبي
query = cities_ref.order("state").order("population", "desc")

يمكنك دمج عوامل التصفية where() مع orderBy() و limit() . في المثال التالي ، تحدد الاستعلامات حدًا لعدد السكان ، وتُفرز حسب السكان بترتيب تصاعدي ، وتُرجع فقط النتائج القليلة الأولى التي تتجاوز الحد:

Web version 9

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

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

Web version 8

citiesRef.where("population", ">", 100000).orderBy("population").limit(2);
سويفت
ملاحظة: هذا المنتج غير متوفر على أهداف watchOS و App Clip.
citiesRef
    .whereField("population", isGreaterThan: 100000)
    .order(by: "population")
    .limit(to: 2)
ج موضوعية
ملاحظة: هذا المنتج غير متوفر على أهداف watchOS و App Clip.
[[[citiesRef queryWhereField:@"population" isGreaterThan:@100000]
    queryOrderedByField:@"population"]
    queryLimitedTo:2];

Java

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

Kotlin+KTX

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(u'cities')
query = cities_ref.where(
    u'population', u'>', 2500000).order_by(u'population').limit(2)
results = query.stream()

Python

cities_ref = db.collection("cities")
query = cities_ref.where("population", ">", 2500000).order_by("population").limit(2)
results = query.stream()
سي ++
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)
بي أتش بي
$query = $citiesRef
    ->where('population', '>', 2500000)
    ->orderBy('population')
    ->limit(2);
وحدة
Query query = citiesRef
    .WhereGreaterThan("Population", 2500000)
    .OrderBy("Population")
    .Limit(2);
سي #
Query query = citiesRef
    .WhereGreaterThan("Population", 2500000)
    .OrderBy("Population")
    .Limit(2);
روبي
query = cities_ref.where("population", ">", 2_500_000).order("population").limit(2)

ومع ذلك ، إذا كان لديك مرشح بمقارنة نطاق ( < ، <= ، > ، >= ) ، يجب أن يكون طلبك الأول في نفس الحقل ، انظر قائمة قيود orderBy() أدناه.

محددات

لاحظ القيود التالية orderBy() :

  • تعمل عبارة orderBy() أيضًا على تصفية وجود الحقول المحددة. لن تتضمن مجموعة النتائج المستندات التي لا تحتوي على الحقول المحددة.
  • إذا قمت بتضمين مرشح بمقارنة نطاق ( < ، <= ، > ، >= ) ، يجب أن يكون طلبك الأول في نفس الحقل:

    صالح : نطاق التصفية orderBy حسب نفس المجال

    Web version 9

    import { query, where, orderBy } from "firebase/firestore";  
    
    const q = query(citiesRef, where("population", ">", 100000), orderBy("population"));

    Web version 8

    citiesRef.where("population", ">", 100000).orderBy("population");
    سويفت
    ملاحظة: هذا المنتج غير متوفر على أهداف watchOS و App Clip.
    citiesRef
        .whereField("population", isGreaterThan: 100000)
        .order(by: "population")
    ج موضوعية
    ملاحظة: هذا المنتج غير متوفر على أهداف watchOS و App Clip.
    [[citiesRef queryWhereField:@"population" isGreaterThan:@100000]
        queryOrderedByField:@"population"];

    Java

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

    Kotlin+KTX

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

    Dart

    final citiesRef = db.collection("cities");
    citiesRef.where("population", isGreaterThan: 100000).orderBy("population");
    جافا
    Query query = cities.whereGreaterThan("population", 2500000L).orderBy("population");
    بايثون
    cities_ref = db.collection(u'cities')
    query = cities_ref.where(
        u'population', u'>', 2500000).order_by(u'population')
    results = query.stream()

    Python

    cities_ref = db.collection("cities")
    query = cities_ref.where("population", ">", 2500000).order_by("population")
    results = query.stream()
    Node.js
    citiesRef.where('population', '>', 2500000).orderBy('population');
    اذهب
    query := cities.Where("population", ">", 2500000).OrderBy("population", firestore.Asc)
    بي أتش بي
    $query = $citiesRef
        ->where('population', '>', 2500000)
        ->orderBy('population');
    وحدة
    Query query = citiesRef
        .WhereGreaterThan("Population", 2500000)
        .OrderBy("Population");
    سي #
    Query query = citiesRef
        .WhereGreaterThan("Population", 2500000)
        .OrderBy("Population");
    روبي
    query = cities_ref.where("population", ">", 2_500_000).order("population")

    غير صالح : نطاق التصفية orderBy الأول حسب الحقول المختلفة

    Web version 9

    import { query, where, orderBy } from "firebase/firestore";  
    
    const q = query(citiesRef, where("population", ">", 100000), orderBy("country"));

    Web version 8

    citiesRef.where("population", ">", 100000).orderBy("country");
    سويفت
    ملاحظة: هذا المنتج غير متوفر على أهداف watchOS و App Clip.
    citiesRef
        .whereField("population", isGreaterThan: 100000)
        .order(by: "country")
    ج موضوعية
    ملاحظة: هذا المنتج غير متوفر على أهداف watchOS و App Clip.
    [[citiesRef queryWhereField:@"population" isGreaterThan:@100000] queryOrderedByField:@"country"];

    Java

    citiesRef.whereGreaterThan("population", 100000).orderBy("country");

    Kotlin+KTX

    citiesRef.whereGreaterThan("population", 100000).orderBy("country")

    Dart

    final citiesRef = db.collection("cities");
    citiesRef.where("population", isGreaterThan: 100000).orderBy("country");
    جافا
    Query query = cities.whereGreaterThan("population", 2500000L).orderBy("country");
    بايثون
    cities_ref = db.collection(u'cities')
    query = cities_ref.where(u'population', u'>', 2500000).order_by(u'country')
    results = query.stream()

    Python

    cities_ref = db.collection("cities")
    query = cities_ref.where("population", ">", 2500000).order_by("country")
    results = query.stream()
    سي ++
    // BAD EXAMPLE -- will crash the program:
    cities_ref.WhereGreaterThan("population", FieldValue::Integer(100000))
        .OrderBy("country");
    Node.js
    citiesRef.where('population', '>', 2500000).orderBy('country');
    اذهب
    // Note: This is an invalid query. It violates the constraint that range
    // and order by are required to be on the same field.
    query := cities.Where("population", ">", 2500000).OrderBy("country", firestore.Asc)
    بي أتش بي
    $invalidRangeQuery = $citiesRef
        ->where('population', '>', 2500000)
        ->orderBy('country');
    وحدة
    Query query = citiesRef
        .WhereGreaterThan("Population", 2500000)
        .OrderBy("Country");
    سي #
    Query query = citiesRef
        .WhereGreaterThan("Population", 2500000)
        .OrderBy("Country");
    روبي
    query = cities_ref.where("population", ">", 2_500_000).order("country")
  • لا يمكنك ترتيب الاستعلام الخاص بك بأي حقل مدرج في المساواة ( = ) أو in بند.