Frage sequelize findAll Sortierreihenfolge in nodejs


Ich versuche, alle Objektliste aus der Datenbank mit Sequelize wie folgt auszugeben und möchte, dass Daten aussortiert werden, wenn ich ID in where-Klausel hinzufüge.

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']
    });
};

Aber das Problem ist nach dem Rendern, alle Daten werden wie folgt sortiert.

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

Wie ich fand, ist es weder nach ID noch nach Name sortiert. Bitte hilf mir, es zu lösen.


13
2018-03-28 09:33


Ursprung


Antworten:


In Sequelize können Sie problemlos Order-By-Klauseln hinzufügen.

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']
    });
};

Schau, wie ich das hinzugefügt habe order Array von Objekten?

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

Bearbeiten:

Möglicherweise müssen Sie die Objekte bestellen, sobald sie in der .then() versprechen. Überprüfen Sie diese Frage zum Bestellen eines Arrays von Objekten basierend auf einer benutzerdefinierten Reihenfolge:

Wie sortiere ich ein Array von Objekten basierend auf der Reihenfolge eines anderen Arrays?


32
2018-03-28 10:20



Sie können dies mit folgenden Code sehr rückgängig machen:

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')
    });
};

Dies ist etwas eingeschränkt, da es sehr schlechte Leistungsmerkmale nach ein paar Dutzend Aufzeichnungen hat, aber es ist akzeptabel in der Größenordnung, die Sie verwenden.

Dies wird eine SQL-Abfrage erzeugen, die ungefähr so ​​aussieht:

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

1
2017-12-23 20:15



Wenn Sie verwenden MySQLkannst du benutzen order by FIELD(id, ...)  Ansatz:

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

Denken Sie daran, es könnte langsam sein. Aber sollte schneller sein, als manuelle Sortierung mit JS.


1
2017-12-16 02:54



Ich glaube nicht, dass dies möglich ist Sequelize's Bestellklausel, soweit ich das beurteilen kann, sind diese Klauseln als binäre Operationen gedacht, die für jedes Element in Ihrer Liste gelten. (Dies ist auch sinnvoll, da das Sortieren einer Liste im Allgemeinen funktioniert.)

So kann eine order-Klausel etwas wie eine Liste sortieren, indem sie rekursiv darüber fragt, welches dieser beiden Elemente älter ist. Während Ihre Bestellung nicht auf eine binäre Operation reduzierbar ist (compare_bigger(1,2) => 2) ist aber nur eine willkürliche2,4,11,2,9,0).

Wenn ich dieses Problem treffe findAll, hier war meine Lösung (sub in Ihren zurückgegebenen Ergebnissen für 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 })});

Was zurückkommt [2, 23, 20, 53, 9]. Ich denke nicht, dass es einen besseren Kompromiss gibt, den wir machen können. Sie können über Ihre geordneten IDs mit iterieren findOne, aber dann machst du n Abfragen, wenn 1 tut.


0
2017-12-20 21:05



Wenn Sie Daten abhängig von einer bestimmten Spalte entweder in aufsteigender oder in absteigender Reihenfolge sortieren möchten, verwenden Sie sequlize js, benutze die order Methode von sequlize wie folgt

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

0
2017-07-20 06:47