source

속편 findnodejs의 모든 정렬 순서

lovecheck 2023. 7. 26. 22:11
반응형

속편 findnodejs의 모든 정렬 순서

나는 다음과 같이 sufficialize로 데이터베이스에서 모든 객체 리스트를 출력하려고 노력하고 있으며 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나 이름으로 분류되지 않았습니다.어떻게 해결해야 하는지 도와주세요.

속편화에서는 절별 순서를 쉽게 추가할 수 있습니다.

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()약속.사용자 지정 순서에 따라 개체 배열을 정렬하는 방법에 대한 이 질문을 확인하십시오.

다른 배열 순서를 기준으로 개체 배열을 정렬하려면 어떻게 해야 합니까?

특정 열을 기준으로 데이터를 오름차순 또는 내림차순으로 정렬하려면 다음을 사용합니다.sequlize js을 사용합니다.order의 방법sequlize하기와 같이

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

MySQL을 사용하는 경우 다음을 사용할 수 있습니다.order by FIELD(id, ...) 접근:

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

속도가 느릴 수 있습니다.하지만 JS로 수동으로 정렬하는 것보다 더 빠를 겁니다.

다음 코드를 사용하여 매우 간접적인 방법으로 이 작업을 수행할 수 있습니다.

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', [...])

조금 늦었을 수도 있지만 접근법을 언급하고 싶습니다.
[46128, 2865, 49569, 1488, 45600, 691, 1418, 619, 53326, 61680]을 기준으로 정렬은 postgre의 ARARY_POSITION 함수를 사용하여 수행할 수 있습니다.SQL.

const arr = [46128, 2865, 49569,  1488,   45600,   61991,  1418,  61919,   53326,   61680];
const ord = [sequelize.literal(`ARRAY_POSITION(ARRAY[${arr}]::integer[], "id")`)];

return Company.findAll({
    where: {
        id: arr
    },
    attributes: ['id', 'logo_version', 'logo_content_type', 'name', 'updated_at'],
    order: ord,
});

가 알기로는, 그 조항들은 목록의 모든 요소에 적용할 수 있는 이진 연산을 의미하기 때문에, 저는 이것이 Sequipize의 순서 조항에서 가능하다고 생각하지 않습니다.일반적으로 목록을 정렬하는 방법도 마찬가지이므로 이 방법은 다음과 같습니다.

따라서, 주문 절은 "이 두 요소 중 어느 것이 더 오래되었습니까?"라고 묻는 목록 위에 재귀적으로 나타나면서 목록을 주문하는 것과 같은 작업을 수행할 수 있습니다.반면에 당신의 주문은 2진법 연산으로 줄일 수 없습니다.compare_bigger(1,2) => 2) 그러나 임의의 시퀀스일 뿐입니다(2,4,11,2,9,0).

이 문제를 해결할 때findAll여기 내 해결책이 있었습니다. (당신이 반환한 결과의 하위 부분)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 })});

반환되는 항목[2, 23, 20, 53, 9]저는 우리가 할 수 있는 더 나은 절충안이 없다고 생각합니다.주문한 ID를 사용하여 적절한 위치에서 반복할 수 있습니다.findOne하지만 당신은 1이 언제쯤이면 되는지 질문을 하고 있습니다.

필요한 경우, 데이터베이스는 필드별로 값의 일반적인 순서로 출력을 정렬합니다.

주문이 이와 같지 않으면 order_field를 선택하고 id 값을 기준으로 값을 지정할 수 있습니다.

case 
when id=46128 then 0
when id=2865 then 1
when id=49569 then 2
end as order_field

and order by order_field.

값이 많으면 ID 기본 키 order_field가 있는 임시 테이블에 원래 순서대로 값을 채울 수 있으며, inner는 값 필드를 사용하여 선택한 값을 해당 임시 테이블에 결합하여 order_field 순으로 정렬할 수 있습니다.

속편으로 어떻게 하는지는 모르지만, 제가 필요로 하는 것들을 어떻게 하는지에 대한 답을 여기서 찾았습니다.

부동산 이름을 둘러싼 "" 인용문을 사용하여 작업했습니다.
디버깅의 경우 후속 작업을 통해 생성되는 쿼리가 무엇인지 확인한 다음 특정 DB 콘솔에서 실행을 시도할 수 있습니다.

으로 내경마으데정수렬습 없 다 할 니 를 터 이 우 막 지 로 ▁last ▁in 니 없 습 다 ▁by ▁the 수updatedAt 기둥란
: " " ":

exports.readAll = (req, res) => {
  console.log("Inside ReadAll Data method");
  let data;
  if (!req.body) {
    data = CompanyModel.findAll({  order: [[sequelize.literal('"updatedAt"'), 'DESC']]});
  } else {
    data = CompanyModel.findAll({  order: [[sequelize.literal('"updatedAt"'), 'DESC']]});
  }
  data
    .then((data) => {
      res.send(
        data
      );
    })
    .catch((err) => {
      res.status(500).send({
        message: err.message || "Some error occurred while retrieving data.",
      });
    });
};

내 경우 SQL 쿼리가 형성되고 있습니다.

Inside ReadAll Data method

Executing (default): SELECT "company_name", "company_id", "on_record", "createdAt", "updatedAt" FROM "companies" AS "company" ORDER BY "updatedAt" DESC;

위에서 @Agniveer의 예를 사용하지만 수정된 UUID 유형을 사용하는 사람이 있는 경우

const ids = [
'f01a057e-5646-4527-a219-336804317246', 
'ee900087-4910-42b4-a559-06aea7b4e250', 
'b363f116-1fc5-473a-aed7-0ceea9beb14d'
];

const idsFormat = `'${ids.join("','")}'`;

const order = [sequelize.literal(`ARRAY_POSITION(ARRAY[${idsFormat}]::uuid[], "<insert_table_name>"."id")`)];

언급URL : https://stackoverflow.com/questions/36259532/sequelize-findall-sort-order-in-nodejs

반응형