DESC 中的订单记录在 SequelizeJS 中不起作用
Posted
技术标签:
【中文标题】DESC 中的订单记录在 SequelizeJS 中不起作用【英文标题】:Order records in DESC not working property in SequelizeJS 【发布时间】:2020-09-15 09:09:23 【问题描述】:在我的应用程序中,我有 Products 表,其中包含各种类型的产品。
在每条记录中都有列调用 updateDetails
并且它是具有以下属性的 JSON
对象。
const updateDetails = time: '2020-05-28T05:53:31.540Z', userId: 1, officeId: 2
但在 Products 表中的某些记录中 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
desc order 排序来获得产品,并且需要在结果末尾有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']]
)
但它无法给出我想要的结果。 提前致谢。
【问题讨论】:
***.com/questions/7621205/… 的副本。赏金阻止关闭。 【参考方案1】:尝试如下。
const results = await Product.findAll(
where: type: 'a' ,
limit: 10,
order: [['updateDetails.time', 'DESC NULLS LAST']]
)
【讨论】:
请注明投反对票的原因【参考方案2】:好吧,如果没有任何效果,您总是可以选择用纯 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)
【讨论】:
【参考方案3】:工作样本是:
// 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;
【讨论】:
这是我的答案的副本 我之前在我的版本中提到过(但已将其删除),由于 6 个字符的限制,我无法修复您的回复。你的回复有错别字。
在 javascript 中不起作用,它不是副本。我删除了该注释,因为我发现注意 updateDatails 类型和 sql 翻译很有用。
棘手的部分是NULLS LAST
。我给出了答案。 updateDetails
已经是 JSONB 类型。任何看到问题的人都可以看到它,并且没有必要提及已翻译的查询。实际上它是不需要的。删除这些东西后,这就是我的答案。?
谢谢。您的回答也是正确且有效的。我错过的是NULLS LAST
,这是@Sudarshana Dayananda 的第一篇回答以上是关于DESC 中的订单记录在 SequelizeJS 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章