Replace With (etapa de transformación)

Descripción

Reemplaza los campos del documento existente por los campos de una expresión determinada.

La expresión puede ser un mapa literal o una expresión que se evalúa como un mapa. Si una expresión determinada no se evalúa como un mapa, esta etapa devuelve un error.

Existen 3 modos compatibles:

  • full_replace: Reemplaza todo el documento con el resultado de la expresión dada, omitiendo los campos que no aparecen en ella.
  • merge_overwrite_existing: Combina la expresión con el documento existente y reemplaza los valores de los campos del documento por los valores de la expresión.
  • merge_keep_existing: Combina la expresión con el documento existente y solo agrega valores de campo cuando no existe ninguno en el documento.

Ejemplos

Crea una colección con los siguientes documentos: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});

Usa el modo full_replace para obtener una versión mutada del documento

Extrae el campo location anidado y descarta todos los demás datos:

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

Esto produce los siguientes documentos:

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

Usa el modo merge_overwrite_existing para establecer campos

Establece el campo population de todos los documentos en 0, lo que sobrescribe los valores existentes:

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

Esto produce los siguientes 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}

Usa el modo merge_keep_existing para agregar un valor predeterminado

Establece un valor predeterminado para location cuando no aparece en un documento:

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

Esto produce los siguientes 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" }