Diferencia entre Firestore Set con {merge: true} y Update

Resuelto ZuzEL asked hace 54 años • 6 respuestas

En Cloud Firestore existen tres operaciones de escritura:

  1. add()
  2. set()
  3. update()

En los documentos dice que el uso set(object, { merge: true })fusionará el objeto dado con el documento existente.

Lo mismo pasa cuando usas update(object)… entonces ¿cuál es la diferencia? Parece extraño que Google duplique una funcionalidad como esta.

ZuzEL avatar Jan 01 '70 08:01 ZuzEL
Aceptado

La forma en que entendí la diferencia:

  • setsin mergesobrescribirá un documento o lo creará si aún no existe

  • setwith mergeactualizará los campos en el documento o lo creará si no existe

  • updateActualizará los campos pero fallará si el documento no existe.

  • createcreará el documento pero fallará si el documento ya existe

También hay una diferencia en el tipo de datos que proporcionas a sety update.

Porque setsiempre hay que proporcionar datos en forma de documento:

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

Con updatetambién puede utilizar rutas de campo para actualizar valores anidados:

update({
  'a.b.c': true
})
Scarygami avatar Oct 06 '2017 07:10 Scarygami

Otra diferencia (ampliando la respuesta de Scarygami) entre "configurar con combinación" y "actualizar" es cuando se trabaja con valores anidados.

si tiene un documento estructurado así:

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

y quiero agregar{"friend-uid-3" : true}

usando esto:

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

dará como resultado estos datos:

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

sin embargo updateusando esto:

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

dará como resultado estos datos:

 `{
   "friends": {
     "friend-uid-3": true
   }
 }`
Finlay Percy avatar Nov 29 '2017 13:11 Finlay Percy

Por documentos: https://firebase.google.com/docs/firestore/manage-data/add-data#update_fields_in_nested_objects

La notación de puntos le permite actualizar un único campo anidado sin sobrescribir otros campos anidados. Si actualiza un campo anidado sin notación de puntos, sobrescribirá todo el campo del mapa.

Como se indicó anteriormente, esto reemplaza toda la estructura de amigos.

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

Esto no lo hace.

db.collection('users').doc('random-id').update({
    "friends.friend-uid-3": true
})
CodeManDan avatar Dec 28 '2019 03:12 CodeManDan

Además de las respuestas anteriores, si desea eliminar campos anidados en un mapa, es posible que desee utilizar updateo setsegún su caso de uso.

Si comienza con lo siguiente y desea eliminar todas las entradas del perfil que no sean, "user1"tiene dos opciones.

{
  "users": {
    "profiles": {
      "user1": ...,
      "user2": ...
    }
  }

Actualizar

Esto se sobrescribirá profilescon lo que se proporcione.

update({
  'users.profiles': { 'user1': ... }
})

Colocar

Esto fusionará las eliminaciones con los perfiles existentes, dejando lo que no se eliminó.

set({
  users: {
    profiles: {
      'user2': FieldValue.delete(),
      'user3': FieldValue.delete(),
      ...
    }
  }
}, { merge: true })

Esto solo se aplica a Maps porque ambos sety updatesobrescribirán las matrices a menos que utilice explícitamente operadores específicos de la matriz, comoarrayUnion .

geg avatar Mar 05 '2021 23:03 geg