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.