Sắp xếp

Mô tả

Sắp xếp các tài liệu đầu vào dựa trên một hoặc nhiều thứ tự sắp xếp được chỉ định.

Ví dụ

Web

const results = await execute(db.pipeline()
  .collection("books")
  .sort(
    field("release_date").descending(), field("author").ascending()
  )
);
Swift
let results = try await db.pipeline()
  .collection("books")
  .sort([
    Field("release_date").descending(), Field("author").ascending()
  ])
  .execute()

Kotlin

val results = db.pipeline()
    .collection("books")
    .sort(
        field("release_date").descending(),
        field("author").ascending()
    )
    .execute()

Java

Task<Pipeline.Snapshot> results = db.pipeline()
    .collection("books")
    .sort(
        field("release_date").descending(),
        field("author").ascending()
    )
    .execute();
Python
from google.cloud.firestore_v1.pipeline_expressions import Field

results = (
    client.pipeline()
    .collection("books")
    .sort(Field.of("release_date").descending(), Field.of("author").ascending())
    .execute()
)
Java
Pipeline.Snapshot results =
    firestore
        .pipeline()
        .collection("books")
        .sort(descending(field("release_date")), ascending(field("author")))
        .execute()
        .get();

Hành vi

Thứ tự sắp xếp

Thứ tự sắp xếp tuân theo thứ tự loại giá trị của Cloud Firestore

Thứ tự xác định của kết quả

Nếu không có giai đoạn sort trong truy vấn, thứ tự của các kết quả được trả về sẽ không xác định và có thể khác nhau giữa các lần thực thi. Nếu có giai đoạn sort nhưng các biểu thức sắp xếp không tạo ra một thứ tự duy nhất trong số các kết quả được trả về, thì thứ tự của các kết quả được trả về vẫn có thể khác nhau giữa các lần thực thi.

Ví dụ: sắp xếp các thành phố theo country của các thành phố, theo thứ tự tăng dần so với tập dữ liệu sau:

{ name: "Los Angeles", state: "CA", country: "USA", population: 3970000 },
{ name: "New York", state: "NY", country: "USA", population: 8530000 }
{ name: "San Francisco", state: "CA", country: "USA", population: 870000 },

có thể tạo ra bất kỳ hoán vị nào của 3 tài liệu trong tập dữ liệu vì tất cả đều có cùng thuộc tính country. Để tạo thứ tự xác định cho kết quả, bạn có thể thêm thứ tự sắp xếp vào name theo thứ tự:

Node.js

const results = await db.pipeline()
  .collection("/cities")
  .sort(field("country").ascending(), fieldd("__name__").ascending())
  .execute();

Thao tác này sẽ sử dụng tên tài liệu duy nhất làm tiêu chí phân định khi nhiều tài liệu có cùng giá trị country. Xin lưu ý rằng bạn có thể dùng mọi trường khác cùng với trường country để tạo thành một khoá duy nhất của tài liệu trong bộ sưu tập nhằm tạo ra một thứ tự kết quả xác định.

Sắp xếp các giá trị tương đương

Các giá trị tương đương được sắp xếp cùng nhau nhưng thứ tự của kết quả trong lớp tương đương không được xác định theo Thứ tự xác định của kết quả. Ví dụ: sắp xếp các thành phố theo size, theo thứ tự tăng dần đối với tập dữ liệu sau:

{ name: "Los Angeles", state: "CA", country: "USA", size: 3970000 },
{ name: "Mexico City", state: null, country: "Mexico", size: 3970000.0 },

có thể tạo ra bất kỳ hoán vị nào của 2 tài liệu trong tập dữ liệu vì cả hai tài liệu đều có giá trị size tương đương là 3970000.

Nhiều giai đoạn sắp xếp

Khi truy vấn chứa nhiều giai đoạn sắp xếp liên tiếp, chỉ giai đoạn sắp xếp cuối cùng mới ảnh hưởng đến kết quả truy vấn. Xin lưu ý rằng điều này khác với hành vi của mệnh đề orderBy trong Core API.

Tối ưu hoá sắp xếp N hàng đầu

Khi limit(...) được dùng sau sort, bạn có thể dùng một loại sắp xếp n hàng đầu. Quá trình tối ưu hoá này giới hạn mức sử dụng bộ nhớ của giai đoạn sắp xếp bằng cách chỉ cho phép lưu trữ N tài liệu tại một thời điểm (theo định nghĩa của limit(...)), giúp quá trình sắp xếp tiết kiệm bộ nhớ hơn.

Giá trị rỗng và giá trị không có

Nếu một trường được chỉ định trong một thứ tự không tồn tại trong một tài liệu, giá trị của trường đó sẽ được sắp xếp như thể giá trị là null. Ví dụ: sắp xếp các thành phố theo state của các thành phố, theo thứ tự tăng dần đối với tập dữ liệu sau:

{ name: "Los Angeles", state: "CA", country: "USA", population: 3970000 },
{ name: "Mexico City", state: null, country: "Mexico", population: 9200000 },
{ name: "New York", state: "NY", country: "USA", population: 8530000 }
{ name: "San Francisco", state: "CA", country: "USA", population: 870000 },
{ name: "Toronto", country: "Canada", population: 2930000 },

sẽ tạo ra kết quả sau đây, trong đó tài liệu "Toronto" và tài liệu "Mexico City" được sắp xếp là null và trước các tài liệu khác.

{ name: "Toronto", country: "Canada", population: 2930000 },
{ name: "Mexico City", state: null, country: "Mexico", population: 9200000 },
{ name: "Los Angeles", state: "CA", country: "USA", population: 3970000 },
{ name: "San Francisco", state: "CA", country: "USA", population: 870000 },
{ name: "New York", state: "NY", country: "USA", population: 8530000 }