Imagina esta estructura de base de datos:
/users(collection) userId/ (doc) likes/ (collection) postId1 (doc) postId2 (doc)Estoy implementando una función para dar me gusta/no me gusta a las publicaciones.
Para eso, estoy ejecutando una transacción en la que get el estado Me gusta (me gusta) usando la transacción, para hacer esto (me gusta) o aquello (no me gusta).
Cuando se realiza una operación Me gusta, necesito agregar la publicación Me gusta a la subcolección Me likes del usuario que le dio Me gusta.
Pero... ¿qué pasa si el documento del usuario (al que le gusta la publicación) se elimina (en la interfaz de usuario tengo una sección para eliminar el perfil del usuario) durante la operación Me gusta?
Si solo hago:
transaction.create(`users/${userId}/likes/${postId}`, denormalizedPostData);¿La transacción detectará la eliminación del documento de usuario?
Si no, ¿qué sucede si también elimino los Me gusta/la subcolección del usuario al eliminar su documento?
deleteUserDoc(userDocRef); deleteFullCollection(userLikesRef, batchSize);Será el
transaction.create(`users/${userId}/likes/${postId}`, data);detectar el "cambio" (la eliminación del documento) y volver a ejecutar la transacción?
Pregunto esto porque sé que debemos asegurarnos de que las lecturas estén situadas antes que las escrituras en el cuerpo de las transacciones, para volver a ejecutar la transacción si los documentos leídos cambian... pero, ¿qué pasa con esta situación?
Tengo miedo de volver a crear el documento del usuario simplemente adjuntando un documento a la colección de Me gusta del usuario mediante la transaction.create() .
¿Debo hacer una lectura adicional en la parte superior de la transacción?
transaction.get(userRef); // Just to ensure the re-executionSi lee el documento en el controlador de transacciones y luego escribe una modificación en él en ese mismo controlador, Firestore SDK envía el estado previo a la transacción y el estado posterior a la transacción de ese documento al servidor. Esto permite que el servidor detecte si el documento se modificó durante la transacción, incluso si se eliminó.