Заменить на

Описание

Заменяет поля в существующем документе полями из заданного выражения.

Выражение может быть либо литеральным отображением, либо выражением, результатом вычисления которого является отображение. Если данное выражение не является отображением, на этом этапе возвращается ошибка.

Поддерживаются 3 режима:

  • full_replace : Заменяет весь документ результатом заданного выражения, исключая поля, которые в нем отсутствуют.
  • merge_overwrite_existing : Объединяет выражение с существующим документом, перезаписывая значения полей в документе значениями из выражения.
  • merge_keep_existing : Объединяет выражение с существующим документом, добавляя значения полей только в том случае, если таковых нет в документе.

Примеры

Создайте коллекцию cities , содержащую следующие документы:

Node.js

await db.collection("cities").doc("SF").set({name: "San Francisco", population: 800000, location: {country: "USA", state: "California"}});
await db.collection("cities").doc("TO").set({name: "Toronto", population:  3000000, province: "ON", location: {country: "Canada", province: "Ontario"}});
await db.collection("cities").doc("NY").set({name: "New York", location: {country: "USA", state: "New York"}});
await db.collection("cities").cov("AT").set({name: "Atlantis", population: null});

Использование режима full_replace позволяет получить измененную версию документа.

Извлеките вложенное поле location , отбросив все остальные данные:

Node.js
  const names = await db.pipeline()
    .collection("/cities")
    .replace_with(Field.of("location"), "full_replace")
    .execute();
    
Java
Pipeline.Snapshot names =
    firestore.pipeline().collection("cities").replaceWith(field("location")).execute().get();
Идти
snapshot := client.Pipeline().
	Collection("cities").
	ReplaceWith(firestore.FieldOf("location")).
	Execute(ctx)

В результате создаются следующие документы:

{ country: "USA", state: "California" },
{ country: "Canada", province: "Ontario" },
{ country: "USA", state: "New York" },
{ }

Использование режима merge_overwrite_existing для установки полей.

Установите значение поля population во всех документах равным 0, перезаписав существующие значения:

Node.js
  const censoredResults = await db.pipeline()
    .collection("/cities")
    .replace_with(map("population", 0), "merge_overwrite_existing")
    .execute();
    

В результате создаются следующие документы:

{name: "San Francisco", population: 0, location: {country: "USA", state: "California"}},
{name: "Toronto", population: 0, province: "ON", location: {country: "Canada", province: "Ontario"}},
{name: "New York", population: 0, location: {country: "USA", state: "New York"}},
{name: "Atlantis", population: 0}

Использование режима merge_keep_existing для добавления значения по умолчанию.

Установка значения по умолчанию для location , если он отсутствует в документе:

Node.js
  const defaultedResults = await db.pipeline()
    .collection("/cities")
    .replace_with(map("location", "unknown"), "merge_keep_existing")
    .execute();
    

В результате создаются следующие документы:

{ name: "San Francisco", population: 800000, location: { country: "USA", state: "California" } },
{ name: "Toronto", province: "ON", population: 3000000, location: { country: "Canada", province: "Ontario" } },
{ name: "New York", location: { country: "USA", state: "New York" } },
{ name: "Atlantis", population: null, location: "unknown" }