Описание
Добавьте новые поля в документы, созданные на предыдущем этапе.
Сгенерированные документы будут содержать все поля из предыдущего этапа, а также все вновь добавленные поля, перезаписывая любые поля с тем же именем из предыдущего документа. Этап add_fields(...) позволяет обновлять вложенные поля, указывая имя вложенного поля в качестве псевдонима.
Примеры
Web
const result = await execute(db.pipeline() .collection("books") .select(field("soldBooks").add(field("unsoldBooks")).as("totalBooks")) );
Быстрый
let result = try await db.pipeline() .collection("books") .select([Field("soldBooks").add(Field("unsoldBooks")).as("totalBooks")]) .execute()
Kotlin
val result = db.pipeline() .collection("books") .select(Expression.add(field("soldBooks"), field("unsoldBooks")).alias("totalBooks")) .execute()
Java
Task<Pipeline.Snapshot> result = db.pipeline() .collection("books") .select(Expression.add(field("soldBooks"), field("unsoldBooks")).alias("totalBooks")) .execute();
Python
from google.cloud.firestore_v1.pipeline_expressions import Field result = ( client.pipeline() .collection("books") .select(Field.of("soldBooks").add(Field.of("unsoldBooks")).as_("totalBooks")) .execute() )
Java
Pipeline.Snapshot result = firestore .pipeline() .collection("books") .select(add(field("soldBooks"), field("unsoldBooks")).as("totalBooks")) .execute() .get();
Поведение
Перекрывающиеся поля
Присвоение выражению псевдонима, уже присутствующего в документах предыдущего этапа, приведет к тому, что этап add_fields(...) перезапишет предыдущее поле. Это можно использовать для объединения нескольких выражений по одному и тому же имени поля, например:
Node.js
const results = await db.pipeline()
.collection("/users")
.addFields(field('age').abs().as('age'))
.addFields(field('age').add(10).as('age'))
.execute();
Вложенные поля
Вложенные поля (например, поля с синтаксисом . ) можно обновлять на этом этапе. Это позволяет обновлять поле «на месте», например, в:
Node.js
const results = await db.pipeline()
.collection("/users")
.addFields(field('address.city').toLower().as('address.city'))
.execute();
Присвоение выражения вложенному полю автоматически создаст и все отсутствующие родительские поля.