Sequelize分页

ita*_*ied 1 pagination node.js sequelize.js

sequelize我的nodejsweb应用程序,我想查询使用分页(按日期)的职位.阅读sequelize文档,他们提供使用offsetlimit.

由于我想显示从新到旧的帖子,我需要考虑它们的创建日期.例如,如果我将第一个查询限制为10个页面,并且在执行第二个查询之前创建了一个新帖子,则下一个偏移量为10的查询将导致上一个查询的重复发布.

我应该如何实现分页以便支持新条目?

aks*_*ade 10

findAndCountAll此数是分页有用的,从这个总数,因为我们希望,我们可以限制也与异步并等待

let resAccidents = await ModalName.findAndCountAll({ where: { createdByID: employeeID }, offset: 0, limit: 10 });
Run Code Online (Sandbox Code Playgroud)

这将根据 where 条件和第 10 条记录返回总记录数,然后增加 offset 的值以获取更多记录。


Bol*_*him 10

你可以简单地这样做

let limit = 10;
let offset = 0 + (req.body.page - 1) * limit;
Posts.findAndCountAll({
  offset: offset,
  limit: limit,
  order: [["date", "ASC"]],
})
  .then(async (result) => {
    return res.status(200).json({
      status: true,
      message: res.__("success"),
      innerData: result,
    });
  })
  .catch((err) => {
    return validator.InvalidResponse(res, `${err}`);
  });
Run Code Online (Sandbox Code Playgroud)


mar*_*ton 9

如果你想要一个稳定的分页,不要对行偏移进行分页,因为它是不稳定的,因为你提到的原因.

您应该针对随时间稳定的值进行分页,并使用where子句来过滤结果.最好的情况是如果你有一个自动递增的id,但是发布日期也可能是合理的.

就像是:

Post.findAll({ 
where: { createdDate: { $lt: previousDate }, 
limit: 10
})
Run Code Online (Sandbox Code Playgroud)

您需要跟踪此ofc的previousDate.这种方法也有一些注意事项,您可能需要将其与客户端重复数据删除相结合.

这篇博文可能包含你需要的所有答案: 分页:你(可能)做错了


0X1*_*X1A 9

最简单的方法是使用Sequelize findAndCountAll

Post.findAndCountAll({
    where: {...},
    order: [...],
    limit: 5,
    offset: 0,
}).then(function (result) {
    res.render(...);
});
Run Code Online (Sandbox Code Playgroud)

在这里,结果有查询的两个结果,算作result.rowresult.count.然后,您可以增加偏移量并将其用于分页.

Sequelize文档 findAndCountAll

  • 是的,如果您使用“findAndCountAll”。但在您的评论中,您说“findAll”也可以用于分页。事实上,“findAll”还接受“limit”和“offset”参数,我不确定这些是否足以进行分页。您是否还需要只有“findAndCountAll”提供的“rows”? (3认同)
  • 另外,如果您只想进行分页,则不需要执行“findAndCountAll” - “findAll”还支持“limit”和“offset”参数。 (2认同)

小智 7

尝试这个:

const paginate = (query, { page, pageSize }) => {
  const offset = page * pageSize;
  const limit = pageSize;

  return {
    ...query,
    offset,
    limit,
  };
};


model.findAll(
  paginate(
    {
      where: {}, // conditions
    },
    { page, pageSize },
  ),
);
Run Code Online (Sandbox Code Playgroud)

为了避免样板代码