Quiero saber cómo hacer agregarme en mi consulta Loopback, estoy usando MySQL como la base de datos que tengo un registro como este en mi DB - { 'app_name': 'chrome', 'duration' : 10000 }, { 'app_name': 'WhatsApp', 'duration' : 25000 } and so on Tenga en cuenta que la duración es en milisegundos. Estoy usando angular 7 como delantero y quiero hacer que la consulta de bucle devuelto suma la duración de mis registros, ahora mismo estoy haciendo una consulta.

Apps.find({}).toPromise()
    .then(apps => {
        let result = apps.reduce((app, total) = {
            total += app.duration;
            return total
        }, 0)
        console.log(result);
    })
    .catch(err => {
        console.log(err);
     })

Sin embargo, con este enfoque, puedo obtener la suma de la duración, pero si tengo millones de registros de los que no es una solución escalable como la iteración de millones de registros y luego suma la duración. Quiero saber si hay agregación en la consulta Loopback para MySQL. Quiero una consulta como -

Apps.find({
      aggregation: {
       sum: 'duration'
     }
    }).toPromise()
    .then(result => {
        console.log(result);
    })
    .catch(err => {
        console.log(err);
     })

Algo como eso.

1
Shailesh Gehlot 29 jun. 2019 a las 09:22

1 respuesta

La mejor respuesta

Loopback aún no admite agregaciones. Mi recomendación es escribir un método controlador personalizado que ejecute una consulta de SQL personalizada para agregar los resultados.

// in your controller
export class MyController {
  constructor(
    @repository(AppRepository) protected appRepo: AppRepository
  ) {}

  // default CRUD methods scaffolded by lb4

  // custom method
  @get('/apps/durations')
  getDurations() {
    return this.appRepo.getAggregatedDurations();
  }
}

// in your AppRepository
export class AppRepository extends DefaultCrudRepository<
  App,
  typeof App.prototype.id,
  AppRelations
> {
  constructor(
    @inject('datasources.db') dataSource: juggler.DataSource,
    // ...
  ) {
    super(App, dataSource);
    // ...
  }

  // add a new method
  async getAggregatedDurations(): Promise<number> {
    // A mock-up SQL query, you may need to tweak it
    const result = await this.execute('SELECT SUM(duration) as total_duration FROM Apps');
    // I am not entirely sure what's the shape of result object,
    // you have to find out yourself how to access "total_duration" field 
    return result[0].total_duration;
  }
}

Consulte también API DOCS para execute Método: https: //loopback.io/doc/en/lb4/apidocs.repository.executablereposity.execute.html y loopback 3.x Documentación: https://loopback.io/doc/en/lb3/executing-native-sql.html

1
Miroslav Bajtoš 1 jul. 2019 a las 10:57