Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

193
Vistas
Angular: aumente el tiempo de carga de consultas en la base de datos de Firebase

Tengo una aplicación angular donde estoy consultando mi base de datos de firebase como se muestra a continuación:

 constructor() { this.getData(); } getData() { this.projectSubscription$ = this.dataService.getAllProjects() .pipe( map((projects: any) => projects.map(sc=> ({ key: sc.key, ...sc.payload.val() })) ), switchMap(appUsers => this.dataService.getAllAppUsers() .pipe( map((admins: any) => appUsers.map(proj =>{ const match: any = admins.find(admin => admin.key === proj.admin); return {...proj, imgArr: this.mapObjectToArray(proj.images), adminUser: match.payload.val()} }) ) ) ) ).subscribe(res => { this.loadingState = false; this.projects = res.reverse(); }); } mapObjectToArray = (obj: any) => { const mappedDatas = []; for (const key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { mappedDatas.push({ ...obj[key], id: key }); } } return mappedDatas; };

Y esto es lo que estoy consultando dentro de dataService:

 getAllProjects() { return this.afDatabase.list('/projects/', ref=>ref.orderByChild('createdAt')).snapshotChanges(); } getAllAppUsers() { return this.afDatabase.list('/appUsers/', ref=>ref.orderByChild('name')).snapshotChanges(); }

El problema al que me enfrento con esto es que tengo 400 filas de datos que estoy tratando de cargar y tarda alrededor de 30 segundos en cargar, lo cual es increíblemente alto. ¿Alguna idea de cómo puedo consultar esto en un tiempo más rápido?

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

No tenemos forma de saber si los 30 son razonables, ya que eso depende de la cantidad de datos cargados, la latencia de la conexión y el ancho de banda del cliente, y más factores que no podemos conocer/controlar.

Pero una cosa a tener en cuenta es que está realizando 400 consultas para obtener los usuarios de cada aplicación individual, lo que probablemente no sea excelente para el rendimiento.

Cosas que podrías considerar:

  • Precargue todos los usuarios una vez y luego use esa lista para cada proyecto.
  • Duplique el nombre de cada usuario en cada proyecto, de modo que no necesite unir ningún dato.

Si tiene experiencia en bases de datos relacionales, esto último puede ser contradictorio, pero en realidad es muy común en el modelado de datos NoSQL y es una de las razones por las que las bases de datos NoSQL escalan tan bien.

about 4 years ago · Juan Pablo Isaza Denunciar

0

Propongo 3 soluciones.

1. Paginación

En lugar de devolver todos esos documentos al cargar la aplicación, limítelos a solo 10 y mantenga un registro del último. Luego muestra el 10 (o cualquier número base arbitrario)

Luego haga la interfaz de usuario de tal manera que el usuario tenga que hacer clic en siguiente o cuando el usuario se desplace, busque el siguiente conjunto en función de la información del campo del último documento anterior.

Supongo que necesita mostrar todos los datos obtenidos en alguna tabla o lista, por lo que tener la interfaz de usuario paginando los datos debería tener sentido.

2. Cargador

Mostrar alguna interfaz de usuario del cargador en la carga del sitio web. Luego, cuando se hayan obtenido todos los documentos, oculta el cargador y muestra los datos como desee. Puede usar algunas cosas personalizadas para el cargador, o elegir entre cualquiera de las abundantes bibliotecas que existen, o usar mat-progress-spinner de Angular Material

3. Función en la nube onCall

¿Qué sucede si intenta obtenerlos a través de una función en la nube onCall? Será más rápido porque es solo una solicitud que hará la aplicación y las funciones en la nube de Firebase son muy rápidas dentro de los centros de datos de Google.

Dado que la red del usuario puede ser lenta para iterar los documentos, la función de la nube regresará de una vez y eso podría brindarle lo que desea.

Supongo que podría optar por esta opción solo si realmente necesita mostrar todos esos datos a la vez en la carga del sitio web.

... Nota sobre el costo

Obtener 400 o más documentos cada vez que se carga un sitio web determinado puede ser costoso. Será costoso si el sitio web es visitado con mucha frecuencia por muchos usuarios. El costo de Firebase aumentará a medida que se le cobre por documento leído también.

Verifique si puede optimizar la estructura de datos para evitar obtener tanto.

Esto no se aplica a usted si se trata de un panel de administración o si la obtención de todos los usuarios de esta manera rara vez se realiza, lo que hace que el costo no sea alto en ese caso.

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda