Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

341
Views
¿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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!