Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

342
Visualizações
¿Cómo se crea un nuevo documento de Firestore dentro de una transacción?

Estoy tratando de registrar cambios en una colección de registros de clientes. Para mantener las cosas a prueba de agua, los registros de registro obviamente deben crearse dentro de una transacción de Firestore. No tengo problemas para usar transaction.set para aplicar los cambios en el documento del cliente, pero cada cambio debe ir acompañado de la creación de un nuevo documento dentro de mi colección de transactionLogs . Aquí, las cosas van muy mal. Los documentos de registro se identifican mediante un campo de marca de tiempo y cuando ejecuto el siguiente código: ...

 import { initializeApp } from 'firebase/app'; import { getFirestore, collection, query, getDoc, getDocs, where, orderBy, addDoc, doc, updateDoc, deleteDoc, runTransaction } from 'firebase/firestore'; var firebaseApp = initializeApp(firebaseConfig); var db = getFirestore(firebaseApp); // code to read and validate update to customer documents and to call the following asynch function function performCustomerUpdate(parameters) { await runTransaction(db, async (transaction) => { // update Customer document and build a transactionLog object const newLogRef = collection(db, 'transactionLogs', transactionLog.timeStamp); await transaction.set(newLogRef, transactionLog); }); }

... la instrucción transaction.set falla diciendo algo como "Invalid collection reference. Collection references must have an odd number of segments, but transactionsLogs/1645451217221 has 2." En este caso particular, 1645451217221 habría sido el valor de transactionLog.timesStamp.

¿Alguien tiene algún consejo sobre lo que está pasando aquí y cómo solucionar el error? Según tengo entendido, transaction.set creará un nuevo registro si la referencia proporcionada no existe, por lo que debería estar en las líneas correctas. Pero, ¿por qué Firestore piensa que quiero crearlo en una colección llamada transaccionesLogs/1645451217221? ¿Cómo obtengo la creación de una referencia para un documento identificado por la cadena '1645451217221' en una colección llamada 'transactionsLogs'?

about 4 years ago · Juan Pablo Isaza
2 Respostas
Responde à pergunta

0

Si especifica la ID del documento (y no usa las ID generadas automáticamente), debe usar doc() en lugar de collection() para crear una DocumentReference :

 const newLogRef = doc(db, 'transactionLogs', transactionLog.timeStamp);

La función collection() se usa para crear una CollectionReference .

Consulte también: Firestore: ¿Cuál es el patrón para agregar nuevos datos en Web v9?


Según tengo entendido, transaction.set creará un nuevo registro si la referencia proporcionada no existe

Si los documentos existen, sobrescribirá el documento existente.

about 4 years ago · Juan Pablo Isaza Relatório

0

Con respecto a la pregunta más amplia de cómo agrega registros dentro de una transacción, la respuesta es que usaría prácticamente el mismo código que usaría fuera de una transacción.

Entonces, mientras que fuera de una transacción, crearía un nuevo documento con un elemento de datos como su identificador con el siguiente código Web Version 9:

 const myDocRef = doc(db, "myCollection", myDocId); await setDoc(myDocRef, myDocData);

Dentro de una transacción , usa exactamente el mismo patrón con la única excepción de que setDoc() se reemplaza por transaction.set() y toda la operación (obviamente) está rodeada por una runTransaction(db, async (transaction) => { :

 await runTransaction(db, async (transaction) => { const myDocRef = doc(db, "myCollection", myDocId); await transaction.set(myDocRef, myDocData); }).catch((error) => { alert(`Oops - transaction failed - error is : ${error}`); });

De manera similar, el patrón utilizado para crear un documento con una identificación generada automáticamente :

 const myCollectionRef = collection(db, "myCollection"); const myDocRef = doc(myCollectionRef) await setDoc(myDocRef, myDocData);

se reemplaza dentro de una transacción por

 const myCollectionRef = collection(db, "myCollection"); const myDocRef = doc(myCollectionRef) await transaction.set(myDocRef, myDocData);

Tenga en cuenta que si necesita encontrar el valor que se le asigna a su identificación generada automáticamente, está disponible como myDocRef.id

about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda