Substituir por

Descrição:

Substitui os campos no documento atual pelos campos em uma determinada expressão. A expressão pode ser um mapa literal ou uma expressão que avalia um mapa. Se uma determinada expressão não for avaliada como um mapa, essa etapa vai retornar um erro.

Sintaxe:

Mode: {full_replace | merge_overwrite_existing | merge_keep_existing}

replace_with(map: Expr, mode: Mode)

Comportamento do modo:

  • full_replace: substitui todo o documento pelo resultado da expressão especificada, omitindo campos que não aparecem nela.
  • merge_overwrite_existing: mescla a expressão com o documento atual, substituindo os valores de campo no documento com os valores na expressão.
  • merge_keep_existing: mescla a expressão com o documento atual, adicionando valores de campo apenas quando eles não existem no documento.

Exemplos:

Crie uma coleção cities com os seguintes documentos:

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});

Usar o modo "full_replace" para receber uma versão mutante do documento

Extraia o campo aninhado location, descartando todos os outros dados:

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();

O que produz os seguintes documentos:

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

Usar o modo "merge_overwrite_existing" para definir campos

Defina o campo population de todos os documentos como 0, substituindo os valores atuais:

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

O que produz os seguintes documentos:

{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}

Usar o modo "merge_keep_existing" para adicionar um valor padrão

Definir um valor padrão para location quando ele não aparece em um documento:

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

O que produz os seguintes documentos:

{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"}