Catch up on everthing we announced at this year's Firebase Summit. Learn more

Đặt hàng và giới hạn dữ liệu với Cloud Firestore

Cloud Firestore cung cấp chức năng truy vấn mạnh mẽ để chỉ định tài liệu nào bạn muốn lấy từ bộ sưu tập. Các truy vấn này cũng có thể được sử dụng với một trong hai get() hoặc addSnapshotListener() , như mô tả trong Get Data .

Đặt hàng và giới hạn dữ liệu

Theo mặc định, một truy vấn truy xuất tất cả các tài liệu đáp ứng truy vấn theo thứ tự tăng dần theo ID tài liệu. Bạn có thể chỉ định thứ tự sắp xếp cho dữ liệu của bạn sử dụng orderBy() , và bạn có thể hạn chế số lượng tài liệu lấy ra sử dụng limit() .

Ví dụ: bạn có thể truy vấn 3 thành phố đầu tiên theo thứ tự bảng chữ cái với:

Phiên bản web 9

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

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

Phiên bản web 8

citiesRef.orderBy("name").limit(3);
Nhanh
citiesRef.order(by: "name").limit(to: 3)
Objective-C
[[citiesRef queryOrderedByField:@"name"] queryLimitedTo:3];

Java

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

Kotlin + KTX

citiesRef.orderBy("name").limit(3)
Java
Query query = cities.orderBy("name").limit(3);
Query query = cities.orderBy("name").limitToLast(3);
Python
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();
Đi
query := cities.OrderBy("name", firestore.Asc).Limit(3)
query := cities.OrderBy("name", firestore.Asc).LimitToLast(3)
PHP
$query = $citiesRef->orderBy('name')->limit(3);
Đoàn kết
Query query = citiesRef.OrderBy("Name").Limit(3);
NS#
Query query = citiesRef.OrderBy("Name").Limit(3);
Ruby
query = cities_ref.order("name").limit(3)

Bạn cũng có thể sắp xếp trong trật tự để có được 3 thành phố cuối cùng giảm dần:

Phiên bản web 9

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

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

Phiên bản web 8

citiesRef.orderBy("name", "desc").limit(3);
Nhanh
citiesRef.order(by: "name", descending: true).limit(to: 3)
Objective-C
[[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)
Java
Query query = cities.orderBy("name", Direction.DESCENDING).limit(3);
Python
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()
C ++
cities_ref.OrderBy("name", Query::Direction::kDescending).Limit(3);
Node.js
const lastThreeRes = await citiesRef.orderBy('name', 'desc').limit(3).get();
Đi
query := cities.OrderBy("name", firestore.Desc).Limit(3)
PHP
$query = $citiesRef->orderBy('name', 'DESC')->limit(3);
Đoàn kết
Query query = citiesRef.OrderByDescending("Name").Limit(3);
NS#
Query query = citiesRef.OrderByDescending("Name").Limit(3);
Ruby
query = cities_ref.order("name", "desc").limit(3)

Bạn cũng có thể đặt hàng theo nhiều trường. Ví dụ: nếu bạn muốn sắp xếp theo tiểu bang và trong mỗi tiểu bang, sắp xếp dân số theo thứ tự giảm dần:

Phiên bản web 9

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

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

Phiên bản web 8

citiesRef.orderBy("state").orderBy("population", "desc");
Nhanh
citiesRef
    .order(by: "state")
    .order(by: "population", descending: true)
Objective-C
[[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)
Java
Query query = cities.orderBy("state").orderBy("population", Direction.DESCENDING);
Python
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
)
C ++
cities_ref.OrderBy("state").OrderBy("name", Query::Direction::kDescending);
Node.js
const byStateByPopRes = await citiesRef.orderBy('state').orderBy('population', 'desc').get();
Đi
query := client.Collection("cities").OrderBy("state", firestore.Asc).OrderBy("population", firestore.Desc)
PHP
$query = $citiesRef->orderBy('state')->orderBy('population', 'DESC');
Đoàn kết
Query query = citiesRef.OrderBy("State").OrderByDescending("Population");
NS#
Query query = citiesRef.OrderBy("State").OrderByDescending("Population");
Ruby
query = cities_ref.order("state").order("population", "desc")

Bạn có thể kết hợp where() bộ lọc với orderBy()limit() . Trong ví dụ sau, các truy vấn xác định ngưỡng dân số, sắp xếp theo dân số theo thứ tự tăng dần và chỉ trả lại một số kết quả đầu tiên vượt quá ngưỡng:

Phiên bản web 9

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

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

Phiên bản web 8

citiesRef.where("population", ">", 100000).orderBy("population").limit(2);
Nhanh
citiesRef
    .whereField("population", isGreaterThan: 100000)
    .order(by: "population")
    .limit(to: 2)
Objective-C
[[[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)
Java
Query query = cities.whereGreaterThan("population", 2500000L).orderBy("population").limit(2);
Python
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()
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();
Đi
query := cities.Where("population", ">", 2500000).OrderBy("population", firestore.Desc).Limit(2)
PHP
$query = $citiesRef
    ->where('population', '>', 2500000)
    ->orderBy('population')
    ->limit(2);
Đoàn kết
Query query = citiesRef
    .WhereGreaterThan("Population", 2500000)
    .OrderBy("Population")
    .Limit(2);
NS#
Query query = citiesRef
    .WhereGreaterThan("Population", 2500000)
    .OrderBy("Population")
    .Limit(2);
Ruby
query = cities_ref.where("population", ">", 2_500_000).order("population").limit(2)

Tuy nhiên, nếu bạn có một bộ lọc với một so sánh phạm vi ( < , <= , > , >= ), đặt hàng đầu tiên của bạn phải trên cùng một trường, xem danh sách các orderBy() hạn chế dưới đây.

Hạn chế

Lưu ý các hạn chế sau cho orderBy() điều khoản:

  • Một orderBy() khoản cũng lọc cho sự tồn tại của các lĩnh vực nhất định. Tập kết quả sẽ không bao gồm các tài liệu không chứa các trường đã cho.
  • Nếu bạn bao gồm một bộ lọc với một so sánh phạm vi ( < , <= , > , >= ), đặt hàng đầu tiên của bạn phải nằm trong cùng lĩnh vực:

    Hợp lệ: Phạm vi lọc và orderBy trên cùng một trường

    Phiên bản web 9

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

    Phiên bản web 8

    citiesRef.where("population", ">", 100000).orderBy("population");
    Nhanh
    citiesRef
        .whereField("population", isGreaterThan: 100000)
        .order(by: "population")
    Objective-C
    [[citiesRef queryWhereField:@"population" isGreaterThan:@100000]
        queryOrderedByField:@"population"];

    Java

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

    Kotlin + KTX

    citiesRef.whereGreaterThan("population", 100000).orderBy("population")
    Java
    Query query = cities.whereGreaterThan("population", 2500000L).orderBy("population");
    Python
    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');
    Đi
    query := cities.Where("population", ">", 2500000).OrderBy("population", firestore.Asc)
    PHP
    $query = $citiesRef
        ->where('population', '>', 2500000)
        ->orderBy('population');
    Đoàn kết
    Query query = citiesRef
        .WhereGreaterThan("Population", 2500000)
        .OrderBy("Population");
    NS#
    Query query = citiesRef
        .WhereGreaterThan("Population", 2500000)
        .OrderBy("Population");
    Ruby
    query = cities_ref.where("population", ">", 2_500_000).order("population")

    Không hợp lệ: Phạm vi lọc và đầu tiên orderBy trên các lĩnh vực khác nhau

    Phiên bản web 9

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

    Phiên bản web 8

    citiesRef.where("population", ">", 100000).orderBy("country");
    Nhanh
    citiesRef
        .whereField("population", isGreaterThan: 100000)
        .order(by: "country")
    Objective-C
    [[citiesRef queryWhereField:@"population" isGreaterThan:@100000] queryOrderedByField:@"country"];

    Java

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

    Kotlin + KTX

    citiesRef.whereGreaterThan("population", 100000).orderBy("country")
    Java
    Query query = cities.whereGreaterThan("population", 2500000L).orderBy("country");
    Python
    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()
    C ++
    // BAD EXAMPLE -- will crash the program:
    cities_ref.WhereGreaterThan("population", FieldValue::Integer(100000))
        .OrderBy("country");
    Node.js
    citiesRef.where('population', '>', 2500000).orderBy('country');
    Đi
    // 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');
    Đoàn kết
    Query query = citiesRef
        .WhereGreaterThan("Population", 2500000)
        .OrderBy("Country");
    NS#
    Query query = citiesRef
        .WhereGreaterThan("Population", 2500000)
        .OrderBy("Country");
    Ruby
    query = cities_ref.where("population", ">", 2_500_000).order("country")
  • Bạn không thể ra lệnh truy vấn của bạn bằng bất kỳ lĩnh vực bao gồm trong một sự bình đẳng ( = ) hoặc in điều khoản.