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ış

Zincirlenmiş ve iç içe yerleştirilmiş filtreler

Birden çok where(...) aşama birbirine bağlanabilir. Bu, mantıksal olarak tek bir where(...) aşamadaki filtre koşullarını and(...) ifadesiyle birleştirmeye eşdeğerdir. Her iki yaklaşım da aynı yürütme planını oluşturur ve sorgu yürütme veya performans üzerinde hiçbir etkisi yoktur.

Örneğin, birden fazla where(...) aşamasını zincirleme:

Node.js

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

, bileşik and(...) ile tek bir where(...) aşaması kullanmaya eş değerdir:

Node.js

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

Ancak koşulların mantıksal or(...) temelinde filtreleme birden fazla aşamaya bölünemez ve 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 aşamaya 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 aşağıdaki where(...) tümcesinin, normal bir SQL sistemindeki HAVING 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üfus boyutu belirli bir değerin üzerinde olan şehirlerin bulunduğu eyaletlerin döndürülmesine olanak tanır.