Diferencia entre Firestore Set con {merge: true} y Update
En Cloud Firestore existen tres operaciones de escritura:
add()
set()
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.
La forma en que entendí la diferencia:
set
sinmerge
sobrescribirá un documento o lo creará si aún no existeset
withmerge
actualizará los campos en el documento o lo creará si no existeupdate
Actualizará los campos pero fallará si el documento no existe.create
creará el documento pero fallará si el documento ya existe
También hay una diferencia en el tipo de datos que proporcionas a set
y update
.
Porque set
siempre hay que proporcionar datos en forma de documento:
set(
{a: {b: {c: true}}},
{merge: true}
)
Con update
también puede utilizar rutas de campo para actualizar valores anidados:
update({
'a.b.c': true
})
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 update
usando esto:
db.collection('users').doc('random-id').update({
"friends": {
"friend-uid-3": true
}
})
dará como resultado estos datos:
`{
"friends": {
"friend-uid-3": true
}
}`
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
})
Además de las respuestas anteriores, si desea eliminar campos anidados en un mapa, es posible que desee utilizar update
o set
segú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á profiles
con 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 Map
s porque ambos set
y update
sobrescribirán las matrices a menos que utilice explícitamente operadores específicos de la matriz, comoarrayUnion
.