Sostituisci con (fase di trasformazione)
Descrizione
Sostituisce i campi nel documento esistente con i campi in una determinata espressione.
L'espressione può essere una mappa letterale o un'espressione che restituisce una mappa. Se una determinata espressione non restituisce una mappa, questa fase restituisce un errore.
Sono supportate tre modalità:
full_replace: sostituisce l'intero documento con il risultato dell'espressione fornita, omettendo i campi che non sono presenti.merge_overwrite_existing: Unisce l'espressione al documento esistente, sovrascrivendo i valori dei campi nel documento con i valori nell'espressionemerge_keep_existing: Unisce l'espressione al documento esistente, aggiungendo i valori dei campi solo se non esistono nel documento.
Esempi
Crea una raccolta cities con i seguenti documenti:
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});
Utilizzo della modalità full_replace per ottenere una versione mutata del documento
Estrai il campo location nidificato, scartando tutti gli altri dati:
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();
che produce i seguenti documenti:
{ country: "USA", state: "California" },
{ country: "Canada", province: "Ontario" },
{ country: "USA", state: "New York" },
{ }
Utilizzo della modalità merge_overwrite_existing per impostare i campi
Imposta il campo population di tutti i documenti su 0, sovrascrivendo i valori esistenti:
Node.js
const censoredResults = await db.pipeline() .collection("/cities") .replace_with(map("population", 0), "merge_overwrite_existing") .execute();
che produce i seguenti documenti:
{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}
Utilizzo della modalità merge_keep_existing per aggiungere un valore predefinito
Impostazione di un valore predefinito per location quando non viene visualizzato in un documento:
Node.js
const defaultedResults = await db.pipeline() .collection("/cities") .replace_with(map("location", "unknown"), "merge_keep_existing") .execute();
che produce i seguenti documenti:
{ 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" }