with sequelize postgres node example and node.js express sequelize.js

node.js - postgres - sequelize routes example



secuela findAll orden de clasificación en nodejs (5)

En la secuela puede agregar fácilmente orden por cláusulas.

exports.getStaticCompanies = function () { return Company.findAll({ where: { id: [46128, 2865, 49569, 1488, 45600, 61991, 1418, 61919, 53326, 61680] }, // Add order conditions here.... order: [ [''id'', ''DESC''], [''name'', ''ASC''], ], attributes: [''id'', ''logo_version'', ''logo_content_type'', ''name'', ''updated_at''] }); };

¿Ves cómo he añadido la matriz de order de los objetos?

order: [ [''COLUMN_NAME_EXAMPLE'', ''ASC''], // Sorts by COLUMN_NAME_EXAMPLE in ascending order ],

Editar:

Es posible que .then() ordenar los objetos una vez que se hayan recibido dentro de la promesa .then() . Verifique esta pregunta sobre cómo ordenar una matriz de objetos según un orden personalizado:

¿Cómo ordeno una matriz de objetos según el orden de otra matriz?

Estoy intentando dar salida a toda la lista de objetos de la base de datos con una secuencia de seguimiento como sigue y quiero obtener los datos se ordenan a medida que agregué id en la cláusula where.

exports.getStaticCompanies = function () { return Company.findAll({ where: { id: [46128, 2865, 49569, 1488, 45600, 61991, 1418, 61919, 53326, 61680] }, attributes: [''id'', ''logo_version'', ''logo_content_type'', ''name'', ''updated_at''] }); };

Pero el problema es que después de la representación, todos los datos se ordenan de la siguiente manera.

46128, 53326, 2865, 1488, 45600, 61680, 49569, 1418, ....

Como he encontrado, no está ordenado por id ni nombre. Por favor, ayúdame a resolverlo.


No creo que esto sea posible en la cláusula de orden de Sequelize , porque, por lo que sé, estas cláusulas están destinadas a ser operaciones binarias aplicables a cada elemento de su lista. (Esto también tiene sentido, ya que generalmente es cómo funciona la clasificación de una lista).

Entonces, una cláusula de orden puede hacer algo así como ordenar una lista recurriendo sobre ella preguntando "¿cuál de estos 2 elementos es más antiguo?" Considerando que su orden no es reducible a una operación binaria ( compare_bigger(1,2) => 2 ) pero es solo una secuencia arbitraria ( 2,4,11,2,9,0 ).

Cuando llegué a este problema con findAll , aquí estaba mi solución (sub en sus resultados devueltos para numbers ):

var numbers = [2, 20, 23, 9, 53]; var orderIWant = [2, 23, 20, 53, 9]; orderIWant.map(x => { return numbers.find(y => { return y === x })});

Lo que devuelve [2, 23, 20, 53, 9] . No creo que podamos hacer una mejor compensación. Puede iterar en su lugar sobre sus identificaciones ordenadas con findOne , pero luego está haciendo n consultas cuando haré 1.


Puedes lograr esto de una manera muy remota con el siguiente código:

exports.getStaticCompanies = function () { var ids = [46128, 2865, 49569, 1488, 45600, 61991, 1418, 61919, 53326, 61680] return Company.findAll({ where: { id: ids }, attributes: [''id'', ''logo_version'', ''logo_content_type'', ''name'', ''updated_at''], order: sequelize.literal(''('' + ids.map(function(id) { return ''"Company"."id" = /''' + id + ''/'''); }).join('', '') + '') DESC'') }); };

Esto es algo limitado porque tiene características de rendimiento muy malas más allá de unas pocas docenas de registros, pero es aceptable en la escala que está utilizando.

Esto producirá una consulta SQL que se parece a esto:

[...] ORDER BY ("Company"."id"=''46128'', "Company"."id"=''2865'', "Company"."id"=''49569'', [...])


Si desea ordenar los datos en orden Ascendente o Descendente en función de una columna en particular, utilizando la sequlize js , use el método de sequlize de la sequlize siguiente manera

// Will order the specified column by descending order order: sequelize.literal(''column_name order'') e.g. order: sequelize.literal(''timestamp DESC'')


Si está utilizando MySQL , puede usar el approach order by FIELD(id, ...) :

Company.findAll({ where: {id : {$in : companyIds}}, order: sequelize.literal("FIELD(company.id,"+companyIds.join('','')+")") })

Tenga en cuenta, podría ser lento. Pero debería ser más rápido, que la clasificación manual con JS.