Обновлять

Этап 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(...) последующие попытки после первой будут бездействовать.