En mi base de datos de Firestore, tengo el siguiente esquema de base de datos con documentos
root | |---transactions/...Quiero mover todas las transacciones a una nueva subcolección como:
root | |---users/user/transactions/...¿Cómo logro esto?
Después de probar algunos enfoques (ver más abajo), esto es lo que funcionó para mí:
1. Migre los datos con una función personalizada utilizando @angular/fire SDK:
// firebase.service.ts import { Injectable } from '@angular/core'; import { AngularFirestore } from '@angular/fire/firestore'; import { first, map } from 'rxjs/operators'; @Injectable({ providedIn: 'root', }) export class FirebaseService { fromCollection = '<name-of-collection>'; toCollection = '<other-root-level-collection>/<document-id>/<subcollection>'; constructor(private firestore: AngularFirestore) {} migrateTransactions() { this.getAllDocuments<YourType>(this.fromCollection).subscribe((documents) => { documents.forEach(async (document) => { await this.createDocument(this.toCollection, document); }); }); } getAllDocuments<T>(path: string) { return this.firestore .collection(path) .get() .pipe( first(), map((collection) => collection.docs.map((doc) => doc.data() as T)) ); } createDocument(path: string, document: unknown) { return this.firestore.collection(path).add(document); } }Nota: Esto solo AGREGA todos los documentos desde el origen a la colección de destino; NO elimina los documentos originales ni sobrescribe ningún documento existente, por lo que es muy seguro de usar. Luego, puede eliminar la colección de origen en la consola de Firebase.
Recuerde que puede concatenar colecciones y documentos anidados y pasarlos como argumento a AngularFirestore.collection(path) (como se ve en la propiedad toCollection ). Esto facilita el recorrido de colecciones anidadas. Si esto es posible en otros SDK, no lo sé.
2. Migrar usando firestore-migrator por Jeff Delaney :
Esto no funcionó para mí ya que la biblioteca falló al convertir las marcas de tiempo de firebase. Si no tiene tipos de datos complejos en su esquema, probablemente funcionará. La biblioteca en sí es una gran utilidad y se puede hacer que funcione localmente si está dispuesto a jugar un poco.
3. Migre mediante el servicio de exportación e importación administrado de Cloud Firestore :
Esto solo funciona para copias de seguridad completas de la base de datos completa o de una colección de nivel raíz. Así que esto podría no ser lo que estás buscando.