Catch up on highlights from Firebase at Google I/O 2023. Learn more

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

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

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

بشكل افتراضي ، يقوم الاستعلام باسترداد جميع المستندات التي تلبي الاستعلام بترتيب تصاعدي حسب معرف المستند. يمكنك تحديد ترتيب الفرز لبياناتك باستخدام orderBy() ، ويمكنك تحديد عدد المستندات المستردة باستخدام limit() . إذا حددت 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];

Kotlin+KTX

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)
بي أتش بي

بي أتش بي

لمزيد من المعلومات حول تثبيت عميل Cloud Firestore وإنشائه ، راجع مكتبات Cloud Firestore Client Libraries .

$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];

Kotlin+KTX

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)
بي أتش بي

بي أتش بي

لمزيد من المعلومات حول تثبيت عميل Cloud Firestore وإنشائه ، راجع مكتبات Cloud Firestore Client Libraries .

$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];

Kotlin+KTX

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')
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)
بي أتش بي

بي أتش بي

لمزيد من المعلومات حول تثبيت عميل Cloud Firestore وإنشائه ، راجع مكتبات Cloud Firestore Client Libraries .

$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];

Kotlin+KTX

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(
    'population', '>', 2500000).order_by('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()
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)
بي أتش بي

بي أتش بي

لمزيد من المعلومات حول تثبيت عميل Cloud Firestore وإنشائه ، راجع مكتبات Cloud Firestore Client Libraries .

$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"];

    Kotlin+KTX

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

    Java

    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('cities')
    query = cities_ref.where(
        'population', '>', 2500000).order_by('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)
    بي أتش بي

    بي أتش بي

    لمزيد من المعلومات حول تثبيت عميل Cloud Firestore وإنشائه ، راجع مكتبات Cloud Firestore Client Libraries .

    $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"];

    Kotlin+KTX

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

    Java

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

    Python

    cities_ref = db.collection("cities")
    query = cities_ref.where("population", ">", 2500000).order_by("country")
    results = query.stream()
    C ++
    // 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)
    بي أتش بي

    بي أتش بي

    لمزيد من المعلومات حول تثبيت عميل Cloud Firestore وإنشائه ، راجع مكتبات Cloud Firestore Client Libraries .

    $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 البند.

orderBy والوجود

عندما تطلب استعلامًا باستخدام حقل معين ، يمكن للاستعلام إرجاع المستندات التي يوجد بها حقل "ترتيب حسب" فقط.

على سبيل المثال ، لن يقوم الاستعلام التالي بإرجاع أي مستندات حيث لم يتم تعيين حقل population ، حتى إذا كانت تفي بعوامل تصفية الاستعلام.

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

التأثير المرتبط ينطبق على عدم المساواة. يشير أيضًا الاستعلام الذي يحتوي على عامل تصفية عدم المساواة في أحد الحقول إلى الترتيب حسب هذا الحقل. لا يُرجع الاستعلام التالي مستندات بدون حقل population حتى إذا كانت country = USA في ذلك المستند. كحل بديل ، يمكنك تنفيذ استعلامات منفصلة لكل طلب أو يمكنك تعيين قيمة لجميع الحقول التي تطلبها.

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

يتضمن طلب البحث أعلاه أمرًا ضمنيًا حسب عدم المساواة ويعادل ما يلي:

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