Necesito obtener una serie de documentos de una colección y migrar estos documentos a otra colección.
Así que creo una consulta para obtener todos los documentos de la primera colección:
const orderQuery = db.collection("FIRST_COLLECTION").where("status", "==", "ACTIVE").get(); const orders: Order[] = mapToObject<Order>(orderQuery); //here I map query from firestore to objects e iterar sobre esta matriz y add a otra colección:
const secondCollectionQuery = db.collection("SECOND_COLLECTION").doc("ID").collection("THIRD_COLLECTION"); for await (const order from orders) { secondCollectionQuery.add(order); }¿Hay una mejor manera de migrar documentos de una colección a otra con firebase? ¡Gracias por cualquier ayuda!
PD. También quiero eliminar el documento de la colección cuando se migre a otra colección, no quiero tener un duplicado
¿Existe una forma mejor de migrar documentos de una colección a otra con Firestore? PD. También quiero eliminar el documento de la colección.
La única forma de mover un documento de una colección a otra colección es la forma que ha descrito en su pregunta, es decir, imitando un "copiar y pegar" con la siguiente secuencia:
Cree una copia del documento de origen en la colección de destino, es decir, léalo de la colección de origen, obtenga los campos del documento y cree un nuevo documento en la colección de destino con estos campos.
Si desea hacer un " cortar y pegar" (también eliminando los documentos de la colección de origen), deberá eliminar estos documentos de la colección de origen después de haber completado la secuencia de copiar/pegar.
Tenga en cuenta que Firestore ofrece la posibilidad de exportar e importar documentos utilizando el servicio de exportación e importación administrado y Cloud Storage , pero no puede exportar documentos de una colección e importarlos en otra colección.
Puede insertar esos add() en una matriz y luego usar Promise.all() para ejecutarlos juntos (o usar escrituras por lotes y migrarlos en lotes de 500). Además, la promesa devuelta por la primera consulta no parece manejarse correctamente. Intente ejecutar la siguiente función asíncrona.
async function migrateDocs() { const oldColRef = db.collection("FIRST_COLLECTION") const newColRef = db.collection("SECOND_COLLECTION") const orderQuery = await oldColRef.where("status", "==", "ACTIVE").limit(500).get(); const addBatch = db.batch(); const delBatch = db.batch(); orderQuery.docs.forEach(doc => { addBatch.set(newColRef.doc(doc.id), doc.data()) delBatch.delete(oldColRef.doc(doc.id)) }) // add docs in new collection await addBatch.commit(); // remove same docs from old collection await delbatch.commit(); console.log("500 docs migrated") } Dado que una escritura por lotes puede contener solo 500 operaciones, tenemos ese .limit(500) , por lo que solo recuperamos 500 documentos. También puede leer todos los documentos y luego crear lotes de 500 (para que no tenga que ejecutar lo mismo una y otra vez manualmente) como se muestra arriba o ejecutar todas las promesas individualmente (preferiría escrituras por lotes).