Tengo una identificación personalizada en mis documentos de Firebase. Quiero obtener un solo documento consultando por esa ID personalizada y modificarlo. Estoy usando firebase v9.
Aquí está mi código hasta ahora:
const toggleLike = async () => { const q = query(collection(db, 'mixrCocktails'), where('id', '==', cocktailId)) const querySnapshot = await getDocs(q) const result: any[] = [] querySnapshot.forEach(doc => result.push(doc.data()) ) if (!isLiked) { await updateDoc(result[0], { userLikes: arrayUnion(publisherId) }) setIsLiked(true) } else { await updateDoc(result[0], { userLikes: arrayRemove(publisherId) }) setIsLiked(false) } } La consulta funciona bien, pero el problema es cuando ejecuto updateDoc . Obtuve el siguiente error:
Uncaught (in promise) FirebaseError: Expected type 'Zu', but it was: a custom Object object Intenté ejecutar result[0].update({ userLikes: arrayUnion(publisherId) }) y obtengo Uncaught (in promise) TypeError: result[0].update is not a function .
yo también he intentado
const docRef = doc(db, "mixrCocktails", cocktail.id) await updateDoc(docRef, { userLikes: arrayUnion(publisherId) })y obtengo
Uncaught (in promise) TypeError: n.indexOf is not a functionEn los documentos (https://firebase.google.com/docs/firestore/manage-data/add-data ) veo que usan una referencia de documento de la siguiente manera:
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") });En el ejemplo, entiendo que "DC" es el ID que establece Firebase para el documento. Pero, ¿cómo puedo crear una referencia consultando otro campo diferente a ese?
El código completo se puede encontrar aquí: https://github.com/coccagerman/mixr
¡Gracias por adelantado!
Basado en tu pregunta, si entiendo bien. Desea consultar un documento usando where antes de actualizar el resultado del documento.
No está haciendo referencia a updateDoc() correctamente. Verifique el fragmento que escribí basado en su fragmento anterior. Aquí hay algunas opciones:
Usando .map :
const q = query(collection(db, 'mixrCocktails'), where('id', '==', cocktailId)); const querySnapshot = await getDocs(q); const documents = querySnapshot.docs.map((doc) => ({ id: doc.id, ...doc.data() })); for (const document of documents) { // console.log(document.id); const documentRef = doc(db, 'mixCocktails', document.id); if (!isLiked) { await updateDoc(documentRef, { userLikes: arrayUnion(publisherId) }) setIsLiked(true) } else { await updateDoc(documentRef, { userLikes: arrayRemove(publisherId) }) setIsLiked(false) } } Usando el método async :
async function updateDocuments (document) { // console.log(document.id); const documentRef = doc(db, 'mixrCocktails', document.id); if (!isLiked) { await updateDoc(documentRef, { userLikes: arrayUnion(publisherId) }) setIsLiked(true) } else { await updateDoc(documentRef, { userLikes: arrayRemove(publisherId) }) setIsLiked(false) } } const q = query(collection(db, 'mixrCocktails'), where('id', '==', cocktailId)); const querySnapshot = await getDocs(q); querySnapshot.forEach((document) => { updateDocuments(document); });Todavía puede mejorar el código escrito anterior para su caso de uso.