Join us in person and online for Firebase Summit on October 18, 2022. Learn how Firebase can help you accelerate app development, release your app with confidence, and scale with ease. Register now

Заказывайте и ограничивайте данные с помощью Cloud Firestore

Оптимизируйте свои подборки Сохраняйте и классифицируйте контент в соответствии со своими настройками.

Cloud Firestore предоставляет мощные функции запросов для указания, какие документы вы хотите получить из коллекции. Эти запросы также можно использовать либо с get() , либо addSnapshotListener() , как описано в разделе Получение данных .

Заказать и ограничить данные

По умолчанию запрос извлекает все документы, удовлетворяющие запросу, в порядке возрастания идентификатора документа. Вы можете указать порядок сортировки ваших данных, используя 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)
Цель-C
Примечание. Этот продукт недоступен для целей 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)
PHP
$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)
Цель-C
Примечание. Этот продукт недоступен для целей 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)
PHP
$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)
Цель-C
Примечание. Этот продукт недоступен для целей 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)
PHP
$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( 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)
Цель-C
Примечание. Этот продукт недоступен для целей 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)
PHP
$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")
    Цель-C
    Примечание. Этот продукт недоступен для целей 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)
    PHP
    $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")
    Цель-C
    Примечание. Этот продукт недоступен для целей 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)
    PHP
    $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 предложение.