在我的nodejs网络应用程序上使用sequelize,我想使用分页(按日期)查询帖子。阅读sequelize文档,他们提供使用offset和limit。由于我想从新到旧显示帖子,我需要考虑它们创建的日期。例如,如果我限制第一个查询为10页,并且在执行第二个查询之前创建了一个新帖子,则偏移量为10的下一个查询将导致与上一个查询重复的帖子。我应该如何实现分页,以便它将支持新的条目?
nodejs
sequelize
offset
limit
qnakjoqk1#
最简单的方法是使用Sequelize的findAndCountAll
findAndCountAll
Post.findAndCountAll({ where: {...}, order: [...], limit: 5, offset: 0, }).then(function (result) { res.render(...); });
在这里,result包含查询结果和计数result.rows和result.count,然后可以增加偏移量并使用它进行分页。findAndCountAll的后续文档
result.rows
result.count
ehxuflar2#
试试这个:
const paginate = (query, { page, pageSize }) => { const offset = page * pageSize; const limit = pageSize; return { ...query, offset, limit, }; }; model.findAll( paginate( { where: {}, // conditions }, { page, pageSize }, ), );
为了避免样板代码
t1qtbnec3#
如果您希望有一个稳定的分页,不要在行偏移量上分页,因为它是不稳定的,正如您提到的原因。你应该使用一个稳定的值来分页,并使用where子句来过滤结果,最好的情况是你有一个自动递增的id,但是发布日期也可以是合理的。比如:
Post.findAll({ where: { createdDate: { $lt: previousDate, }, }, limit: 10, });
您需要跟踪此ofc的previousDate。此方法也有一些注意事项,您可能需要将其与客户端重复数据消除结合使用。下面是一篇博客文章,可能有你需要的所有答案:Pagination: You're (Probably) Doing It Wrong
jdzmm42g4#
对于findAndCountAll,此处的计数对于分页非常有用,我们可以根据需要限制总计数,也可以使用异步和等待
let resAccidents = await ModalName.findAndCountAll({ where: { createdByID: employeeID }, offset: 0, limit: 10, });
这将根据where条件返回总记录数和它的前10个记录,然后增加offset的值以获取更多记录。
9w11ddsr5#
你可以简单地这样做
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}`); });
j2qf4p5b6#
db.findAll({ offset: page_no,// your page number limit:25,// your limit
wnvonmuf7#
这个解决了我的问题。
export const paginate = (query, schema) => { let page = query.page ? query.page - 1 : 0; page = page < 0 ? 0 : page; let limit = parseInt(query.limit || 10); limit = limit < 0 ? 10 : limit; const offset = page * limit; const where = {}; delete query.page; delete query.limit; Object.keys(schema).forEach((key) => { schema[key] && query[key] ? (where[key] = query[key]) : null; }); return { where: where, offset, limit, }; }; @Get() findAll(@Query() query): unknown { return this.model.findAll(paginate(query, {xx:1})); }
/型号?xx=yy页码= 1限值=5
ux6nzvsh8#
var defered = Q.defer(); const offset = queryString.offset * queryString.limit; const limit = queryString.limit; var queryWhere = { class_id: { $ne: null }, section_id: { $ne: null } }; var searchClass = {}; var searchSection = {}; if (queryString) { if (queryString.class && queryString.class !== "") { searchClass = { class_id: { $eq: queryString.class } }; } else if (queryString.class && queryString.class === "") { searchClass = { class_id: { $ne: null } }; } if (queryString.section && queryString.section !== "") { searchSection = { section_id: { $eq: queryString.section } }; } else if (queryString.section && queryString.section === "") { searchSection = { section_id: { $ne: null } }; } } queryWhere = { $and: [[searchClass], [searchSection]] }; const schoolDB = require("../../db/models/tenant")(schema); const Student = schoolDB.model("Student"); Student.findAll({ attributes: [ "id", "first_name", "last_name", "profile_image_url", "roll_number", "emergency_contact_number" ], offset: offset, limit: limit, where: queryWhere, order: [["roll_number", "ASC"]] }) .then(result => { defered.resolve(result); }) .catch(err => { defered.reject(err); });
Recommended using Sequelize's own operators
8条答案
按热度按时间qnakjoqk1#
最简单的方法是使用Sequelize的
findAndCountAll
在这里,result包含查询结果和计数
result.rows
和result.count
,然后可以增加偏移量并使用它进行分页。findAndCountAll
的后续文档ehxuflar2#
试试这个:
为了避免样板代码
t1qtbnec3#
如果您希望有一个稳定的分页,不要在行偏移量上分页,因为它是不稳定的,正如您提到的原因。
你应该使用一个稳定的值来分页,并使用where子句来过滤结果,最好的情况是你有一个自动递增的id,但是发布日期也可以是合理的。
比如:
您需要跟踪此ofc的previousDate。此方法也有一些注意事项,您可能需要将其与客户端重复数据消除结合使用。
下面是一篇博客文章,可能有你需要的所有答案:Pagination: You're (Probably) Doing It Wrong
jdzmm42g4#
对于
findAndCountAll
,此处的计数对于分页非常有用,我们可以根据需要限制总计数,也可以使用异步和等待这将根据where条件返回总记录数和它的前10个记录,然后增加offset的值以获取更多记录。
9w11ddsr5#
你可以简单地这样做
j2qf4p5b6#
试试这个:
wnvonmuf7#
这个解决了我的问题。
/型号?xx=yy页码= 1限值=5
ux6nzvsh8#