Konum

Açıklama

Önceki aşamadaki dokümanları filtreleyerek yalnızca koşulun true olarak değerlendirildiği dokümanları döndürür.

Örnekler

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();
Go
results1, err := client.Pipeline().
	Collection("books").
	Where(firestore.FieldOf("rating").Equal(5)).
	Where(firestore.FieldOf("published").LessThan(1900)).
	Execute(ctx).Results().GetAll()
if err != nil {
	fmt.Fprintf(w, "GetAll failed: %v", err)
	return err
}

results2, err := client.Pipeline().
	Collection("books").
	Where(firestore.And(
		firestore.FieldOf("rating").Equal(5),
		firestore.FieldOf("published").LessThan(1900),
	)).
	Execute(ctx).Results().GetAll()
if err != nil {
	fmt.Fprintf(w, "GetAll failed: %v", err)
	return err
}

Davranış

Birden Fazla Aşama

Birden fazla where(...) aşama birbirine bağlanabilir ve her koşulda and(...) ifadesi olarak işlev görebilir.

Node.js

const cities = await db.pipeline()
  .collection("/cities")
  .where(field("location.country").equals("USA"))
  .where(field("population").greaterThan(500000))
  .execute();

İki koşulun mantıksal or işlemine göre filtreleme tek bir where(...) aşamada yapılmalıdır.

Node.js

const cities = await db.pipeline()
  .collection("/cities")
  .where(field("location.state").equals("NY").or(field("location.state").equals("CA")))
  .execute();

Karmaşık İfadeler

Filtre koşulu, derinlemesine iç içe yerleştirilmiş ifadeler ve mantıksal operatörler içeren karmaşık filtre koşulları içerebilir. Örneğin:

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"))))

normal ifadeye göre /cities filtreler veya şehir, yeterince uzun bir eyalet adıyla USA ise. Koşul olarak herhangi bir ifade verilebilir ancak yalnızca true olarak değerlendirilen ifadelerle eşleşir.

Aşamalı Sipariş

Aşamaların sırası, sorgu değerlendirme sırasını değiştirebileceği için önemlidir. Örneğin, şu sorgu:

Node.js

const cities = await db.pipeline()
  .collection("/cities")
  .limit(10)
  .where(field("location.country").equals("USA"))
  .execute();

önceki limit(...) aşaması, where(...) aşamasına sağlanan belgeleri kısıtladığı için yalnızca 10 belgelik (rastgele olabilir) bir küme için location.country üzerinde filtreleme yapar. Bu nedenle, where(...) aşamalarını sorguda mümkün olduğunca erken bir yere yerleştirmek genel bir kuraldır.

HAVING-Beğenme İşlevi:

where(...) aşaması, belgelerin şemasını değiştiren herhangi bir aşamadan (ör. select(...) veya aggregate(...)) sonra gelebilir ve bu aşamalardan üretilen alanlara atıfta bulunur. aggregate(...) için önemli olan nokta, birikmiş alanlara atıfta bulunan bir where(...) yan tümcesinin, normal bir SQL sistemindeki HAVING yan tümcesi gibi davranmasıdır. Örneğin:

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))

Toplam nüfusu belirli bir büyüklüğün üzerinde olan şehirlerin bulunduğu eyaletlerin döndürülmesine olanak tanır.