Deskripsi
Memfilter dokumen dari tahap sebelumnya sehingga hanya menampilkan dokumen
yang kondisinya menghasilkan nilai true.
Sintaksis:
where(condition: Expr)
Contoh
Buat koleksi cities dengan dokumen berikut:
Node.js
await db.collection('cities').doc('SF').set({name: 'San Francisco', state: 'CA', country: 'USA', population: 870000});
await db.collection('cities').doc('LA').set({name: 'Los Angeles', state: 'CA', country: 'USA', population: 3970000});
await db.collection('cities').doc('NY').set({name: 'New York', state: 'NY', country: 'USA', population: 8530000});
await db.collection('cities').doc('TOR').set({name: 'Toronto', state: null, country: 'Canada', population: 2930000});
await db.collection('cities').doc('MEX').set({name: 'Mexico City', state: null, country: 'Mexico', population: 9200000});
Melakukan penelusuran kesetaraan:
Node.js
const cities = await db.pipeline()
.collection("/cities")
.where(field("state").equals("CA"))
.execute();
Memberikan hasil berikut:
{name: 'San Francisco', state: 'CA', country: 'USA', population: 870000},
{name: 'Los Angeles', state: 'CA', country: 'USA', population: 3970000}
Contoh klien
Web
let results; results = await execute(db.pipeline().collection("books") .where(field("rating").equal(5)) .where(field("published").lessThan(1900)) ); results = await execute(db.pipeline().collection("books") .where(and(field("rating").equal(5), field("published").lessThan(1900))) );
Swift
var results: Pipeline.Snapshot results = try await db.pipeline().collection("books") .where(Field("rating").equal(5)) .where(Field("published").lessThan(1900)) .execute() results = try await db.pipeline().collection("books") .where(Field("rating").equal(5) && Field("published").lessThan(1900)) .execute()
Kotlin
var results: Task<Pipeline.Snapshot> results = db.pipeline().collection("books") .where(field("rating").equal(5)) .where(field("published").lessThan(1900)) .execute() results = db.pipeline().collection("books") .where(Expression.and(field("rating").equal(5), field("published").lessThan(1900))) .execute()
Java
Task<Pipeline.Snapshot> results; results = db.pipeline().collection("books") .where(field("rating").equal(5)) .where(field("published").lessThan(1900)) .execute(); results = db.pipeline().collection("books") .where(Expression.and( field("rating").equal(5), field("published").lessThan(1900) )) .execute();
Python
from google.cloud.firestore_v1.pipeline_expressions import And, Field results = ( client.pipeline() .collection("books") .where(Field.of("rating").equal(5)) .where(Field.of("published").less_than(1900)) .execute() ) results = ( client.pipeline() .collection("books") .where(And(Field.of("rating").equal(5), Field.of("published").less_than(1900))) .execute() )
Java
Pipeline.Snapshot results1 = firestore .pipeline() .collection("books") .where(field("rating").equal(5)) .where(field("published").lessThan(1900)) .execute() .get(); Pipeline.Snapshot results2 = firestore .pipeline() .collection("books") .where(and(field("rating").equal(5), field("published").lessThan(1900))) .execute() .get();
Perilaku
Beberapa Tahap
Beberapa tahap where(...) dapat digabungkan dan akan bertindak sebagai ekspresi and(...)
di setiap kondisi.
Node.js
const cities = await db.pipeline()
.collection("/cities")
.where(field("location.country").equals("USA"))
.where(field("population").greaterThan(500000))
.execute();
Pemfilteran berdasarkan logika or dari dua kondisi harus dilakukan sebagai
satu tahap where(...).
Node.js
const cities = await db.pipeline()
.collection("/cities")
.where(field("location.state").equals("NY").or(field("location.state").equals("CA")))
.execute();
Ekspresi Kompleks
Kondisi filter dapat berisi kondisi filter kompleks yang memiliki sejumlah ekspresi yang disusun bertingkat dan operator logika. Contoh:
Node.js
const cities = await db.pipeline()
.collection("/cities")
.where(
field("name").like("San%")
.or(
field("location.state").charLength().greaterThan(7)
.and(field("location.country").equals("USA"))))
memfilter /cities berdasarkan ekspresi reguler, atau jika kota berada di USA
dengan nama negara bagian yang cukup panjang. Ekspresi apa pun dapat dijadikan sebagai kondisi, tetapi
hanya akan cocok dengan kondisi yang bernilai true.
Pengurutan Tahap
Urutan tahap itu penting karena dapat mengubah urutan evaluasi kueri. Misalnya, kueri:
Node.js
const cities = await db.pipeline()
.collection("/cities")
.limit(10)
.where(field("location.country").equals("USA"))
.execute();
hanya akan memfilter location.country untuk sekumpulan 10
dokumen (yang berpotensi acak) karena tahap limit(...) sebelumnya membatasi dokumen yang
pernah diberikan ke tahap where(...). Dengan demikian, aturan umumnya adalah
menempatkan tahap where(...) seawal mungkin dalam kueri.
Fungsi Mirip HAVING:
Tahap where(...) dapat dilakukan setelah tahap apa pun yang mengubah skema
dokumen, seperti select(...) atau aggregate(...), dan akan merujuk ke kolom
yang dihasilkan dari tahap tersebut. Catatan penting untuk aggregate(...), klausa
where(...) setelahnya yang merujuk ke kolom yang dikumpulkan bertindak seperti klausa HAVING
dalam sistem SQL biasa. Contoh:
Node.js
const cities = await db.pipeline()
.collection("/cities")
.aggregate({
accumulators: [field("population").sum().as("total_population")],
groups: ['location.state']
})
.where(field("total_population").greaterThan(10000000))
dapat menampilkan negara bagian yang memiliki kota dengan total ukuran populasi tertentu.