Deskripsi
Mengurutkan dokumen input berdasarkan satu atau beberapa penataan urutan yang ditentukan.
Sintaksis
Contoh berikut mengurutkan koleksi cities menurut population dalam urutan menaik:
Node.js
const results = await db.pipeline()
.collection("/cities")
.sort(Field.of("population").ascending())
.execute();
Contoh berikut mengurutkan koleksi cities menurut length nama kota dalam urutan menaik.
Node.js
const results = await db.pipeline()
.collection("/cities")
.sort(Field.of("name").charLength().ascending())
.execute();
Contoh klien
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();
Perilaku
Tata urutan
Tata urutan mengikuti urutan jenis nilai Cloud Firestore
Urutan Hasil yang Deterministik
Jika tidak ada tahap sort dalam kueri, urutan hasil yang ditampilkan tidak bersifat deterministik dan dapat bervariasi antar-eksekusi. Jika tahap sort ada, tetapi ekspresi pengurutan gagal menghasilkan pengurutan unik di antara hasil-hasil yang ditampilkan, pengurutan hasil yang ditampilkan mungkin masih bervariasi antar-eksekusi.
Misalnya, mengurutkan kota menurut country kota dalam urutan menaik terhadap set data berikut
{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},
dapat menghasilkan permutasi 3 dokumen dalam set data karena semuanya memiliki atribut country yang sama. Untuk menghasilkan urutan hasil yang deterministik, Anda dapat menambahkan tata urutan pada name ke urutan:
Node.js
const results = await db.pipeline()
.collection("/cities")
.sort(Field.of("country").ascending(), Field.of("__name__").ascending())
.execute();
Cara ini akan menggunakan nama dokumen unik sebagai tiebreaker saat beberapa dokumen memiliki nilai country yang sama. Perhatikan bahwa kolom lain yang membentuk kunci unik dokumen dalam koleksi bersama dengan kolom country dapat digunakan untuk menghasilkan urutan hasil yang deterministik.
Mengurutkan Nilai yang Setara
Nilai yang setara diurutkan bersama, tetapi urutan hasil dalam kelas yang setara tidak bersifat deterministik berdasarkan pembahasan terkait Urutan Hasil yang Deterministik. Misalnya, mengurutkan kota menurut size dalam urutan menaik terhadap set data berikut
{name: 'Los Angeles', state: 'CA', country: 'USA', size: 3970000},
{name: 'Mexico City', state: null, country: 'Mexico', size: 3970000.0},
dapat menghasilkan permutasi 2 dokumen dalam set data karena kedua dokumen tersebut memiliki nilai size yang setara, yaitu 3970000.
Beberapa Tahap Pengurutan
Jika kueri berisi beberapa tahap pengurutan yang beruntun, hanya tahap pengurutan terakhir yang memengaruhi hasil kueri. Perhatikan bahwa hal ini berbeda dengan perilaku klausul orderBy di Core API.
Pengoptimalan Pengurutan N Teratas
Jika limit digunakan setelah sort, pengurutan n teratas dapat digunakan. Pengoptimalan ini membatasi penggunaan memori tahap sort dengan hanya mengizinkannya menyimpan N dokumen dalam satu waktu—seperti yang ditentukan oleh limit—sehingga pengurutan lebih hemat memori.
Nilai Null dan Tidak Ada
Jika kolom yang ditentukan dalam pengurutan tidak ada dalam dokumen, nilainya akan diurutkan seolah-olah nilai tersebut adalah null.
Misalnya, mengurutkan kota menurut state kota dalam urutan menaik terhadap set data berikut
{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},
memberikan hasil berikut, di mana dokumen "Toronto" dan dokumen "Mexico City" diurutkan sebagai null dan sebelum dokumen lainnya.
{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}