Básicamente, lo que quiero es que si un documento no existe, cree uno nuevo (ahora funciona bien), pero si existe un documento, inserte un nuevo objeto en la matriz existente.
Pude obtener datos de documentos y consola. Regístrelos, pero no sé cómo insertar nuevos en el documento existente.
Mi estructura de FB se ve así:
favorites someUserID Videos [ 0: { name: SomeName url: SomeUrl }, /* I would like to push new objects like this: */ 1: { name: data.name url: data.url }, ]Este es mi código actual:
const { user } = UserAuth(); const UserID = user.uid; const favoritesRef = doc(db, "favorites", UserID); const test = async (data) => { try { await runTransaction(db, async (transaction) => { const sfDoc = await transaction.get(favoritesRef); if (!sfDoc.exists()) { setDoc(favoritesRef, { Videos: [{name: data.name}] }); } /* I got my document content here */ const newFavorites = await getDoc(favoritesRef); console.log("Document data:", newFavorites.data()); /* And would like to push new Data here */ transaction.update(favoritesRef, { name: data.name}); }); console.log("Transaction successfully committed!"); } catch (e) { console.log("Transaction failed: ", e); } }Para actualizar el arreglo, Firestore ahora tiene una función que le permite actualizar un arreglo sin volver a escribir su código:
Actualizar elementos en una matriz
Si su documento contiene un campo de matriz, puede usar
arrayUnion()yarrayRemove()para agregar y eliminar elementos.arrayUnion()agrega elementos a una matriz, pero solo los elementos que aún no están presentes.arrayRemove()elimina todas las instancias de cada elemento dado.
import { doc, updateDoc, arrayUnion, arrayRemove } from "firebase/firestore"; const washingtonRef = doc(db, "cities", "DC"); // Atomically add a new region to the "regions" array field. await updateDoc(washingtonRef, { regions: arrayUnion("greater_virginia") }); // Atomically remove a region from the "regions" array field. await updateDoc(washingtonRef, { regions: arrayRemove("east_coast") });No estoy seguro si esto ayuda, pero lo que suelo hacer es:
Estoy agregando a cada usuario que inicia sesión en una matriz.
const snapshot = await getDoc(doc(db, "allUsers", "list")); const currentUsers = snapshot.data().users; await setDoc(doc(db, "allUsers", "list"), { users: [...currentUsers, { name, uid: userId, avatar: photo }], }); Primero obtengo los elementos que existen en la lista, y luego creo uno nuevo que tiene todos los elementos anteriores y los que estoy agregando. currentUsers es la lista actual en ese caso. Tal vez deberías probar esto en lugar de Videos: [{name: data.name}]
setDoc(favoritesRef, { Videos: [...currentVideos, {name: data.name}] })Lo acabo de resolver así:
const { user } = UserAuth(); const UserID = user.uid const favoritesRef = doc(db, "favorites", UserID) const test = async (data) => { try { await runTransaction(db, async (transaction) => { const sfDoc = await transaction.get(favoritesRef); if (!sfDoc.exists()) { await setDoc(favoritesRef, { favs: [ { name: data.name, ytb: data.ytb, url: data.url }]}) } const doesExists = sfDoc.data().favs.some((fav) => fav.name === data.name) console.log(doesExists) if (doesExists === true) { console.log("AlreadyExist") } else { const currentData = sfDoc.data().favs transaction.update(favoritesRef, { favs: [...currentData, { name: data.name, ytb: data.ytb, url: data.url }]} )} }); console.log("Transaction successfully committed!"); } catch (e) { console.log("Transaction failed: ", e); } }