Sequelize配置以检索包含详细信息的总计数

时间:2017-11-29 06:59:21

标签: node.js database postgresql sequelize.js

我正在使用 postgres 数据库中的节点 sequelize 。 我正在将分页记录加载到我的UI,现在我需要使用我用于检索分页记录的相同查询来获取总记录数。 任何人,请提供样本sequelize配置来做同样的事情。 请参阅我的预期样本postgres查询以澄清我的问题

SELECT count(*) over() as total ,name FROM students  WHERE gender='male' LIMIT 2 

提前致谢

4 个答案:

答案 0 :(得分:6)

如果您想避免指定SQL,也可以使用findAndCountAll

答案 1 :(得分:5)

你不能用续集来做到这一点,但是你可以通过2个单独的查询来完成,一个用于获取所需的数据,另一个用于获取总数。

第一个:

await Model.findAll({ where: { columnName: condition });
第二个:

await Model.count({ where: { columnName: condition });

如果您想在一个查询中执行此操作(这可能不是最佳方式)(因为您为每个结果添加的元数据不是与模型相关的元数据),您可以创建raw query,如下所示:

await sequelize.query('select count(*) over(), name from table where condition', { model: Model });

我希望我的解释可以帮助你:),

度过美好的一天!

答案 2 :(得分:0)

您可以为此使用findAndCountAll

  

findAndCountAll-搜索数据库中的多个元素,同时返回数据和总数

这里是一个例子:

const getStudents = async params => {
  const { count, rows: students } = await Student.findAndCountAll({
    where: {
      gender: 'male',
    },
    limit: DEFAULT_PAGE_SIZE,
    order: [['id', 'ASC']],
    ...params,
  });
  return { count, students };
}

这使用ES6解构和散布运算符以及async / await语法。

params是具有limitoffset属性的对象,这些属性将覆盖默认限制和偏移量。

请注意,如果您在查询中include其他模型,则可能还需要传递distinct: true

答案 3 :(得分:0)

您可以通过两种方式对数据进行计数

  1. 使用数据(findAndCountAll
  2. 没有数据(count

1 :具有数据

const students = await students.findAndCountAll({
  where: {
     gender = "male"
  }
});
console.log(students)

它将返回gender是男性的Count学生以及该学生的数据

2 没有数据

const students = await students.findAndCountAll({
  where: {
     gender = "male"
  }
});
console.log(students)

它将仅返回gender是男性的Count学生