Di mana

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.