web-dev-qa-db-fra.com

Les enregistrements de commande dans DESC ne fonctionnent pas dans SequelizeJS

Dans mon application, j'ai un tableau Produits qui contient différents types de produits. Dans chaque enregistrement ont un appel de colonne updateDetails et c'est un objet JSON avec les attributs ci-dessous.

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

Mais dans certains enregistrements de la table Products updateDetails est null et sera mis à jour après l'enregistrement modifié par n'importe quel utilisateur.

Mon exemple d'enregistrements DB comme ci-dessous.

[
 { 
  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 }
 }
]

Ce que je voulais faire, c'est avoir besoin d'obtenir des produits en les triant sur updateDetails.time ordre desc et besoin d'avoir des enregistrements avec updateDetails = null à la fin des résultats. Résultats attendus comme ci-dessous.

[
  { 
    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
  }
]

J'ai utilisé la requête ci-dessous mais sans succès.

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

Mais cela ne pouvait pas donner les résultats souhaités. Merci d'avance.

8

Eh bien, si rien ne fonctionne, vous avez toujours une option pour trier cela en JavaScript brut :)

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)
0
ABGR