Sequelize findOne最新条目

Noa*_*oah 31 javascript node.js sequelize.js

我需要在表格中找到最新的条目.做这个的最好方式是什么?该表有Sequelize的默认createdAt字段.

Krz*_*pka 53

方法findOne是方法的包装器findAll.因此,您可以简单地使用findAll限制1和按降序排序.

例:

YourModel.findAll({
  limit: 1,
  where: {
    //your where conditions, or without them if you need ANY entry
  },
  order: [ [ 'createdAt', 'DESC' ]]
}).then(function(entries){
  //only difference is that you get users list limited to 1
  //entries[0]
}); 
Run Code Online (Sandbox Code Playgroud)

  • 那又怎样 `findOne`返回一个对象,`findAll`返回一个数组!这是一个巨大的差异! (2认同)
  • @NicHartley,是的,如果您假设id和createdAt都已被索引,则我同意您的观点,当然createdAt会更清晰,但正如我之前告诉的那样,createdAt通常是未索引的审计字段,并且可以通过添加总而言之,数据库中的新索引与重用主键相比,只保留一个不会降低插入/删除性能并节省磁盘空间的索引。另一个 (2认同)

szy*_*zym 42

model.findOne({
    where: {
        key: key,
    },
    order: [ [ 'createdAt', 'DESC' ]],
});
Run Code Online (Sandbox Code Playgroud)

  • 不,简单问题.简单回答.你不需要更多.我自己正在寻找答案,这些信息正是我自己寻找的.在太多信息的混乱中,往往更少. (10认同)
  • 我还认为这是比原始帖子更好的答案,因为它使用正确的 Sequelize 方法,需要更少的参数,并且不需要从数组中解包。我还认为 @VinceBowdren 要求更多上下文的请求是无效的,因为原始问题中没有上下文需要任何解释。 (6认同)
  • 要在不知道密钥的情况下查找最新条目,只需完全省略“where”参数 (5认同)
  • 嗨szym; 你的代码可能是正确的,但有了一些上下文,它会得到更好的答案; 例如,您可以解释此提议的更改将如何以及为何解决提问者的问题,可能包括相关文档的链接.这将使它对他们更有用,对于寻找类似问题解决方案的其他网站读者也更有用. (3认同)
  • @syzm 当您的方法只返回一个结果时,为什么有人要订购结果,如果您没有密钥怎么办?在大多数情况下,我们无法访问最新条目的键。 (2认同)

小智 13

如果有人将时间戳设置为 false,您也可以使用 id 来完成此操作。这对我有用。

model.findOne({
order: [ [ 'id', 'DESC' ]],
});
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的答案。每个使用“createdAt”的人都有可能获得错误的对象,因为sequelize中的ISO8601日期是第二精确的。如果您在同一秒创建了 2 个对象,则它可能会找到并返回错误的对象。如果您使用增量 ID,则可以保证它是有序的。 (4认同)