Этап update(...) обновляет существующие документы.
Примеры
Например, следующая операция заполняет данные об изменении модели во всех документах группы коллекций. Конвейер добавляет поле preferences.color ко всем документам в группе коллекций users , у которых отсутствует это поле.
Node.js
const snapshot = await db.pipeline() .collectionGroup("users") .where(not(exists(field("preferences.color")))) .addFields(constant(null).as("preferences.color")) .removeFields("color") .update() .execute();
Python
from google.cloud.firestore_v1.pipeline_expressions import Constant, Field, Not snapshot = ( client.pipeline() .collection_group("users") .where(Not(Field.of("preferences.color").exists())) .add_fields(Constant.of(None).as_("preferences.color")) .remove_fields("color") .update() .execute() )
Java
Pipeline.Snapshot snapshot = firestore.pipeline() .collectionGroup("users") .where(not(exists(field("preferences.color")))) .addFields(constant((String) null).as("preferences.color")) .removeFields("color") .update() .execute().get();
Идти
snapshot := client.Pipeline(). CollectionGroup("users"). Where(firestore.Not(firestore.FieldExists(firestore.FieldOf("preferences.color")))). AddFields(firestore.Selectables( firestore.ConstantOfNull().As("preferences.color"), )). RemoveFields(firestore.Fields("color")). Update(). Execute(ctx)
Поведение
Все этапы обработки данных с помощью языков программирования (DML) должны выполняться в конце конвейера.
Документы, поступающие на этот этап, должны содержать поле __name__ для идентификации документов, которые необходимо обновить. Операция завершится неудачей, если какой-либо из документов не существует. Большинство этапов ввода (например, collection(...) , collection_group(...) , database(...) и documents(...) ) включают поле __name__ по умолчанию.
При желании можно указать transformations которые будут применяться непосредственно перед записью документов. Они действуют аналогично добавлению add_fields(...) непосредственно перед заключительным этапом вывода, и выражения выполняются в контексте предыдущих документов.
В ответе содержится сводная информация о количестве измененных документов. Например, следующий ответ подтверждает, что конвейер обработки данных изменил три документа:
{documents_modified: 3L}
Ограничения
Этапы DML не поддерживают Cloud Firestore Security Rules . Попытки выполнения операций DML через Cloud Firestore Security Rules будут отклонены.
В режиме предварительного просмотра этой функции выполнение операций DML в рамках транзакции невозможно. Дополнительную информацию о поведении в отношении согласованности см. в разделе «Согласованность» .
Если на этапе, предшествующем этапу DML, создается несколько документов с одинаковым
__name__, каждый экземпляр обрабатывается. Дляupdate(...)это означает, что один и тот же целевой документ может быть изменен несколько раз. Дляdelete(...)последующие попытки после первой будут бездействовать.