Node.js 后继分页

Node.js 后继分页,node.js,pagination,sequelize.js,Node.js,Pagination,Sequelize.js,在我的nodejsweb应用程序上使用sequelize,我想使用分页(按日期)查询帖子。在阅读时,他们提供使用偏移量和限制 因为我想显示从新到旧的帖子,所以我需要考虑他们创建的日期。例如,如果我将第一个查询限制为10页,并且在执行第二个查询之前创建了一个新的post,那么偏移量为10的下一个查询将从上一个查询中生成一个重复的post 我应该如何实现分页以使其支持新条目?如果您希望有一个稳定的分页,请不要在行偏移量上分页,因为它是不稳定的,这是您提到的原因 您的目标应该是对随时间稳定的值进行分页

在我的
nodejs
web应用程序上使用
sequelize
,我想使用分页(按日期)查询帖子。在阅读时,他们提供使用
偏移量
限制

<>因为我想显示从新到旧的帖子,所以我需要考虑他们创建的日期。例如,如果我将第一个查询限制为10页,并且在执行第二个查询之前创建了一个新的post,那么偏移量为10的下一个查询将从上一个查询中生成一个重复的post


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

如果您希望有一个稳定的分页,请不要在行偏移量上分页,因为它是不稳定的,这是您提到的原因

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

比如:

Post.findAll({ 
where: { createdDate: { $lt: previousDate }, 
limit: 10
})
您需要跟踪此ofc的上一个日期。这种方法还有一些注意事项,您可能需要将其与客户端重复数据消除相结合

以下是一篇博客文章,可能包含了您需要的所有答案:
最简单的方法是使用Sequelize的
findAndCountAll

Post.findAndCountAll({
    where: {...},
    order: [...],
    limit: 5,
    offset: 0,
}).then(function (result) {
    res.render(...);
});
在这里,result既有查询的结果,也有计数为
result.row
result.count
。然后可以增加偏移量并将其用于分页


使用
findAndCountAll
这里的计数对于分页非常有用,从这个总计数中,我们可以根据需要进行限制,也可以使用async和wait进行限制

let resAccidents = await ModalName.findAndCountAll({ where: { createdByID: employeeID }, offset: 0, limit: 10 });
这将根据where条件返回总记录数,并返回前10条记录,然后增加偏移量值以获取更多记录。

请尝试以下操作:

db.findAll({
   offset: page_no,// your page number
      limit:25,// your limit
var defered=Q.defer();
常量偏移=queryString.offset*queryString.limit;
常量限制=queryString.limit;
var queryWhere={class_id:{$ne:null},section_id:{$ne:null};
var searchClass={};
var searchSection={};
如果(查询字符串){
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}};
}
}
查询位置={
$and:[[searchClass],[searchSection]]
};
const schoolDB=require(“../../db/models/tenant”)(模式);
const Student=学校数据库模型(“学生”);
学生芬德尔({
属性:[
“身份证”,
“名字”,
“姓”,
“配置文件\图像\ url”,
“卷号”,
“紧急联系电话”
],
抵销:抵销,
极限:极限,
地点:queryWhere,
订单:[“卷号”,“ASC”]]
})
。然后(结果=>{
推迟。解决(结果);
})
.catch(错误=>{
延迟。拒绝(错误);
});
建议使用Sequelize自己的操作符
您只需简单地执行即可

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}`)
    })
试试这个:

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

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


model.findAll(
  paginate(
    {
      where: {}, // conditions
    },
    { page, pageSize },
  ),
);

为了避免样板代码,这个解决了我的问题

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}));
}
export const paginate=(查询,模式)=>{
设page=query.page?query.page-1:0;
页面=页面<0?0:页面;
让limit=parseInt(query.limit | | 10);
极限=极限<0?10:极限;
常量偏移=页面*限制;
常量,其中={};
删除query.page;
删除query.limit;
Object.keys(schema).forEach((key)=>{
模式[key]&&query[key]?(其中[key]=query[key]):空;
});
返回{
where:where,
抵消,
极限,
};
};
@得到()
findAll(@Query()Query):未知{
返回this.model.findAll(paginate(查询,{xx:1}));
}

/model?xx=yy&page=1&limit=5

还有一个
findAndCount
helper方法,它将基于此返回项目计数,而不是项目本身。另外,如果只想分页,则不需要执行
findAndCountAll
findAll
还支持
限制
偏移量
参数。@ZachBloomquist,但您如何知道您有多少页?@Ioanna查看链接文档-
res.result
将包含匹配行的总数,而
res.rows
将包含受
limit
offset
限制的行,如果使用
findAndCountAll
。但是在你的评论中,你说
findAll
也可以用于分页。实际上,
findAll
也接受
限制
偏移
参数,我不确定这些参数是否足以分页。您是否还需要只有
findAndCountAll
提供的
?findAndCountAll方法将有助于计算总数据计数如果我们不需要总计数,这也很有帮助。工作非常完美!对于retrieve all just set offset:null,limit:null,这实际上是对所有文档进行计数还是在内部使用计数估计?请尝试添加对您正在执行的操作及其原因的描述。