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 表中的某些记录中 updateDetailsnull 并且会在任何用户编辑该记录后更新。

我的示例数据库记录如下。

[
  
  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 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

SequelizeJS 中的慢关联

Sequelizejs 中的 .save 和 .create 有啥区别?

LINQ 中的最大日期记录

同一视图中的 kohana 搜索过滤器

使用 SequelizeJS 编写带有外键的迁移

我真的需要在 sequelizejs 中定义模型吗?