Saltar al contenido

¿Cómo conseguir un recuento distinto con sequelize?

Solución:

ACTUALIZAR: Nueva versión

Como se mencionó en los comentarios, las cosas han cambiado desde mi publicación original. Ahora hay separado distinct y col opciones. Los documentos para distinct estado:

Aplicar COUNT (DISTINCT (col)) en la clave principal o en options.col.

Parece que ahora quieres algo como:

MyModel.count({
  include: ...,
  where: ...,
  distinct: true,
  col: 'Product.id'
})
.then(function(count) {
    // count is an integer
});

Publicación original

Después de mirar el método Model.count en lib / model.js, y rastrear algo de código, encontré que al usar Model.count, puede agregar cualquier tipo de argumento de función agregada compatible con MYSQL a su objeto de opciones. El siguiente código le dará la cantidad de diferentes valores en MyModel‘s someColumn:

MyModel.count({distinct: 'someColumn', where: {...}})
.then(function(count) {
    // count is an integer
});

Ese código genera efectivamente una consulta de este tipo: SELECT COUNT(args) FROM MyModel WHERE ..., dónde args son todas las propiedades en el objeto de opciones que no están reservadas (como DISTINCT, LIMIT etcétera).

Parece que esto ahora es compatible con las versiones 1.7.0+ de Sequelize.

los count y findAndCountAll Los métodos de un modelo le darán un recuento ‘real’ o ‘distinto’ de su modelo principal.

La documentación de Sequelize sobre count enlaces a un método de recuento que no le permite especificar qué columna obtener el recuento de valores distintos:

Model.prototype.count = function(options) {
  options = Utils._.clone(options || {});
  conformOptions(options, this);
  Model.$injectScope(this.$scope, options);
  var col="*";
  if (options.include) {
    col = this.name + '.' + this.primaryKeyField;
    expandIncludeAll.call(this, options);
    validateIncludedElements.call(this, options);
  }
  Utils.mapOptionFieldNames(options, this);
  options.plain = options.group ? false : true;
  options.dataType = new DataTypes.INTEGER();
  options.includeIgnoreAttributes = false;
  options.limit = null;
  options.offset = null;
  options.order = null;
  return this.aggregate(col, 'count', options);
};

Básicamente SELECT COUNT(DISTINCT(*)) o SELECT COUNT(DISTINCT(primaryKey)) si tiene una clave primaria definida.

Para hacer el equivalente de Sequelize de SELECT category, COUNT(DISTINCT(product)) as 'countOfProducts' GROUP BY category, harías:

model.findAll({
  attributes: [
    'category',
    [Sequelize.literal('COUNT(DISTINCT(product))'), 'countOfProducts']
  ],
  group: 'category'
})
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *