Actualización de Firebase frente a un set

Como dice el título, no puedo encontrar las diferencias entre update y set . Además, los documentos no me pueden ayudar, ya que el ejemplo de actualización funciona exactamente igual si utilizo set en su lugar.

El ejemplo de update de los documentos:

 function writeNewPost(uid, username, title, body) { var postData = { author: username, uid: uid, body: body, title: title, starCount: 0 }; var newPostKey = firebase.database().ref().child('posts').push().key; var updates = {}; updates['/posts/' + newPostKey] = postData; updates['/user-posts/' + uid + '/' + newPostKey] = postData; return firebase.database().ref().update(updates); } 

El mismo ejemplo usando el set

 function writeNewPost(uid, username, title, body) { var postData = { author: username, uid: uid, body: body, title: title, starCount: 0 }; var newPostKey = firebase.database().ref().child('posts').push().key; firebase.database().ref().child('/posts/' + newPostKey).set(postData); firebase.database().ref().child('/user-posts/' + uid + '/' + newPostKey).set(postData); } 

Así que tal vez el ejemplo de los documentos debe actualizarse, porque ahora parece que la update y el set hacen exactamente lo mismo.

Saludos cordiales, Bene

Atomicidad

Una gran diferencia entre las dos muestras que ha dado es en la cantidad de operaciones de escritura que envían a los serveres de Firebase.

En el primer caso, está enviando un solo command update (). Ese command completo tendrá éxito o fallará. Por ejemplo: si el usuario tiene permiso para publicar en /user-posts/' + uid , pero no tiene permiso para publicar /posts publicar, toda la operación fallará.

En el segundo caso, estás enviando dos commands separados. Con los mismos permissions, la escritura en /user-posts/' + uid tendrá éxito, mientras que la escritura en /posts fallará.

Actualización parcial vs sobreescritura completa

Otra diferencia no es inmediatamente visible en este ejemplo. Pero di que estás actualizando el título y el cuerpo de una publicación existente, en lugar de escribir una nueva publicación.

Si usaras este código:

 firebase.database().ref().child('/posts/' + newPostKey) .set({ title: "New title", body: "This is the new body" }); 

Estarías reemplazando toda la publicación existente. Por lo tanto, los campos originales uid , author y starCount se habrán ido y solo habrá un nuevo title y body .

Si, por otro lado, usa una actualización:

 firebase.database().ref().child('/posts/' + newPostKey) .update({ title: "New title", body: "This is the new body" }); 

Después de ejecutar este código, el uid original, el author y starCount seguirán allí, así como también el title y el body actualizados.