node.js-在nodejs中序列化findAll排序顺序

我正在尝试使用sequelize从数据库中输出所有对象列表,如下所示,并希望在我在where子句中添加id时对数据进行整理。

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

但是问题是渲染后,所有数据按如下进行整理。

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

正如我发现的那样,它既没有按ID也没有按名称排序。 请帮我解决。

PPShein asked 2020-08-07T05:38:29Z
5个解决方案
98 votes

在序列化中,您可以轻松添加order by子句。

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

看看如何添加order对象数组?

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

编辑:

一旦在.then()许诺中收到对象,您可能必须订购这些对象。 查看有关基于自定义顺序对对象数组进行排序的问题:

如何根据另一个数组的顺序对对象数组进行排序?

James111 answered 2020-08-07T05:38:52Z
2 votes

如果要基于特定列以升序或降序对数据进行排序,请使用sequlize js,请使用orderorder方法,如下所示

// Will order the specified column by descending order
order: sequelize.literal('column_name order')
e.g. order: sequelize.literal('timestamp DESC')
meenal answered 2020-08-07T05:39:13Z
1 votes

您可以使用以下代码以非常反手的方式完成此操作:

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

这在一定程度上受到了限制,因为过去几十条记录都具有非常糟糕的性能特征,但是在您使用的规模上是可以接受的。

这将产生一个如下所示的SQL查询:

[...] ORDER BY ("Company"."id"='46128', "Company"."id"='2865', "Company"."id"='49569', [...])
drs answered 2020-08-07T05:39:42Z
1 votes

如果使用的是MySQL,则可以使用order by FIELD(id, ...)方法:

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

请记住,它可能很慢。 但是应该比使用JS手动排序更快。

Pavlo Razumovskyi answered 2020-08-07T05:40:06Z
0 votes

我认为这在Sequelize的order子句中是不可能的,因为据我所知,这些子句是适用于列表中每个元素的二进制操作。 (这也很有意义,因为通常是对列表进行排序的方式。)

因此,order子句可以通过递归询问“这两个元素中的哪个更旧?”来对列表进行排序。 而您的订购不能简化为二进制操作([2, 23, 20, 53, 9]),而只能是任意序列(findOne)。

当我用[2, 23, 20, 53, 9]遇到此问题时,这是我的解决方案(在您返回的findOne返回结果中,包括以下内容):

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

返回[2, 23, 20, 53, 9]。我认为我们无法做出更好的权衡。 您可以使用findOne在订购的ID上进行就地迭代,但是当1可以执行时,您将进行n次查询。

Alex Moore-Niemi answered 2020-08-07T05:40:41Z
translate from https://stackoverflow.com:/questions/36259532/sequelize-findall-sort-order-in-nodejs