私のアプリケーションには、さまざまなタイプの製品を含むProductsテーブルがあります。各レコードには列呼び出しupdateDetails
があり、以下の属性を持つJSON
オブジェクトです。
const updateDetails = { time: '2020-05-28T05:53:31.540Z', userId: 1, officeId: 2}
ただし、Productsテーブルの一部のレコードupdateDetails
はnull
であり、ユーザーがレコードを編集した後に更新されます。
私のサンプルDBレコードは以下のとおりです。
[
{
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
desc順序でソートして製品を取得する必要があり、結果の最後に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']]
})
しかし、それは私の望ましい結果を与えることができませんでした。前もって感謝します。
まあ、何もうまくいかない場合は、常にこれをプレーンJavaScriptでソートするオプションがあります:)
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)