Записи заказов в DES C не работает свойство в SequelizeJS - PullRequest
8 голосов
/ 28 мая 2020

В моем приложении есть таблица Products, содержащая различные типы продуктов. В каждой записи есть вызов столбца updateDetails, и это объект JSON с указанными ниже атрибутами.

const updateDetails = { time: '2020-05-28T05:53:31.540Z', userId: 1, officeId: 2}

Но в некоторых записях в таблице продуктов updateDetails равно null и будет обновлено после редактирования записи любым пользователем.

Мои образцы записей БД, как показано ниже.

[
 { 
  name: 'Product 1', 
  type: 'a', 
  updateDetails: { time: '2020-05-28T05:53:31.540Z', userId: 1, officeId: 2 }
 },
 { 
  name: 'Product 2', 
  type: 'a', 
  updateDetails: null
 },
 { 
  name: 'Product 3', 
  type: 'a', 
  updateDetails: { time: '2020-05-27T05:53:31.540Z', userId: 1, officeId: 2 }
 },
 { 
  name: 'Product 4', 
  type: 'a', 
  updateDetails: null
 },
 { 
  name: 'Product 5', 
  type: 'a', 
  updateDetails: { time: '2020-05-20T05:53:31.540Z', userId: 1, officeId: 2 }
 }
]

Я хотел получить продукты, отсортировав их по порядку updateDetails.time des c и иметь записи с updateDetails = null в конце результатов. Ожидаемые результаты, как показано ниже.

[
  { 
    name: 'Product 1', 
    type: 'a', 
    updateDetails: { time: '2020-05-28T05:53:31.540Z', userId: 1, officeId: 2 }
  },
  { 
    name: 'Product 3', 
    type: 'a', 
    updateDetails: { time: '2020-05-27T05:53:31.540Z', userId: 1, officeId: 2 }
  },
  { 
    name: 'Product 5', 
    type: 'a', 
    updateDetails: { time: '2020-05-20T05:53:31.540Z', userId: 1, officeId: 2 }
  },
  { 
    name: 'Product 2', 
    type: 'a', 
    updateDetails: null
  },
  { 
    name: 'Product 4', 
    type: 'a', 
    updateDetails: null
  }
]

Я использовал нижеприведенный запрос, но безуспешно.

const results = await Product.findAll({
      { where: { type: 'a' } },
      limit: 10,
      order: [['updateDetails.time', 'DESC']]
    })

Но он не смог дать желаемых результатов. Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 31 мая 2020

Рабочий пример:

// await Product.bulkCreate([ ... ])
const results = await Product.findAll({
  where: { type: 'a' },
  limit: 10,
  order: [['updateDetails.time', 'DESC NULLS LAST']]
});

Обратите внимание, что updateDetails должен иметь тип JSONB.

Запрос заказа преобразован в:

ORDER BY ("Product"."updateDetails"#>>'{time}') DESC NULLS LAST LIMIT 10;
1 голос
/ 31 мая 2020

Попробуйте следующее.

const results = await Product.findAll({
      where: { type: 'a' },
      limit: 10,
      order: [['updateDetails.time', 'DESC NULLS LAST']]
    })
0 голосов
/ 31 мая 2020

Ну, если ничего не работает, у вас всегда есть возможность отсортировать это на простом JavScript :)

var data =[
 { 
  name: 'Product 1', 
  type: 'a', 
  updateDetails: { time: '2020-05-28T05:53:31.540Z', userId: 1, officeId: 2 }
 },
 { 
  name: 'Product 2', 
  type: 'a', 
  updateDetails: null
 },
 { 
  name: 'Product 3', 
  type: 'a', 
  updateDetails: { time: '2020-05-27T05:53:31.540Z', userId: 1, officeId: 2 }
 },
 { 
  name: 'Product 4', 
  type: 'a', 
  updateDetails: null
 },
 { 
  name: 'Product 5', 
  type: 'a', 
  updateDetails: { time: '2020-05-20T05:53:31.540Z', userId: 1, officeId: 2 }
 }
]
data.sort((a,b)=>{
  if(a.updateDetails && !b.updateDetails){
    return -1
  }
  return a.name - b.name;

});

console.log(data)
...