Описание
Фильтрует документы с предыдущего этапа, возвращая только те документы, в которых условие оценивается как true .
Примеры
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))) );
Быстрый
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();
Идти
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 }
Поведение
Многоэтапные
Несколько этапов where(...) могут быть объединены в цепочку, выступая в качестве выражения and(...) для каждого условия.
Node.js
const cities = await db.pipeline()
.collection("/cities")
.where(field("location.country").equals("USA"))
.where(field("population").greaterThan(500000))
.execute();
Фильтрация на основе логического or двух условий должна выполняться в виде единого этапа с условием where(...) .
Node.js
const cities = await db.pipeline()
.collection("/cities")
.where(field("location.state").equals("NY").or(field("location.state").equals("CA")))
.execute();
Сложные выражения
Условие фильтрации может содержать сложные условия фильтрации, включающие глубоко вложенные выражения и логические операторы. Например:
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"))))
Фильтры /cities на основе регулярного выражения или если город находится в USA и имеет достаточно длинное название штата. В качестве условия можно указать любое выражение, но будут найдены только те, которые оцениваются как true .
Порядок этапов
Порядок этапов важен, поскольку он может изменить порядок выполнения запроса. Например, запрос:
Node.js
const cities = await db.pipeline()
.collection("/cities")
.limit(10)
.where(field("location.country").equals("USA"))
.execute();
Фильтрация по location.country будет выполняться только для (потенциально случайного) набора из 10 документов, поскольку предыдущий этап limit(...) ограничивает количество документов, которые когда-либо будут предоставлены этапу where(...) . Учитывая это, эмпирическое правило заключается в том, чтобы размещать этапы where(...) как можно раньше в запросе.
HAVING , аналогичной функциональности:
Этап where(...) может следовать за любым этапом, изменяющим схему документов, например select(...) или aggregate(...) , и будет ссылаться на поля, полученные на этих этапах. Важно отметить, что для aggregate(...) следующий за ним оператор where(...) , ссылающийся на накопленные поля, действует как оператор HAVING в типичной системе SQL. Например:
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))
позволяет получить список штатов, в которых количество городов превышает определенную сумму населения.