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.
Sintaxis:
Mode: {full_replace | merge_overwrite_existing | merge_keep_existing}
replace_with(map: Expr, mode: Mode)
Comportamiento del modo:
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 cities con los siguientes 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});
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"}