web-dev-qa-db-fra.com

Différence entre set with {merge: true} et update

Dans Cloud Firestore, il y a trois opérations d'écriture:

1) ajouter

2) ensemble

3) mise à jour

Dans la documentation, il est dit que l'utilisation de set(object, {merge: true}) fusionnera un objet avec un existant.

La même chose se produit lorsque vous utilisez update(object) Alors, quelle est la différence, le cas échéant? Il semble étrange que Google duplique la logique.

62
ZuzEL

La façon dont j'ai compris la différence:

  • set sans fusion va écraser un document ou le créer s'il n'existe pas encore

  • set avec fusion mettra à jour les champs du document ou le créera s'il n'existe pas

  • update mettra à jour les champs mais échouera si le document n'existe pas

  • create créera le document mais échouera si le document existe déjà

Il existe également une différence dans le type de données que vous fournissez à set et update.

Pour set vous devez toujours fournir des données en forme de document:

set(
  {a: {b: {c: true}}},
  {merge: true}
)

Avec update, vous pouvez également utiliser des chemins de champs pour mettre à jour les valeurs imbriquées:

update({
  'a.b.c': true
})
137
Scarygami

Une autre différence (étendant la réponse de Scarygami) entre "set with merge" et "update", concerne l'utilisation de valeurs imbriquées.

si vous avez un document structuré comme ceci:

 {
   "friends": {
     "friend-uid-1": true,
     "friend-uid-2": true,
   }
 }

et veut ajouter {"friend-uid-3" : true}

en utilisant ceci:

db.collection('users').doc('random-id').set({ "friends": { "friend-uid-3": true } },{merge:true})

se traduira par ces données:

 {
   "friends": {
     "friend-uid-1": true,
     "friend-uid-2": true,
     "friend-uid-3": true
   }
 }

cependant update en utilisant ceci:

db.collection('users').doc('random-id').update({ "friends": { "friend-uid-3": true } })

se traduira par ces données:

 `{
   "friends": {
     "friend-uid-3": true
   }
 }`
46
Finlay Percy