Remplacer par (étape de transformation)

Description

Remplace les champs du document existant par les champs d'une expression donnée.

L'expression peut être une carte littérale ou une expression qui renvoie à une carte. Si une expression donnée n'est pas évaluée en tant que carte, cette étape renvoie une erreur.

Trois modes sont disponibles :

  • full_replace : remplace l'intégralité du document par le résultat de l'expression donnée, en omettant les champs qui n'y figurent pas.
  • merge_overwrite_existing : fusionne l'expression avec le document existant, en remplaçant les valeurs de champ du document par celles de l'expression.
  • merge_keep_existing : fusionne l'expression avec le document existant, en ajoutant uniquement des valeurs de champ lorsqu'il n'en existe pas dans le document.

Exemples

Créez une collection cities avec les documents suivants :

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

Utiliser le mode "full_replace" pour obtenir une version mutée du document

Extrayez le champ location imbriqué en supprimant toutes les autres données :

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

qui produit les documents suivants :

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

Utiliser le mode "merge_overwrite_existing" pour définir des champs

Définissez le champ population de tous les documents sur 0, en écrasant les valeurs existantes :

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

qui produit les documents suivants :

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

Utiliser le mode "merge_keep_existing" pour ajouter une valeur par défaut

Définir une valeur par défaut pour location lorsqu'il n'apparaît pas dans un document :

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

qui produit les documents suivants :

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