如何动态更改查询值

时间:2018-04-13 07:00:57

标签: node.js postgresql express sequelize.js

我正在构建一个应用程序,Express,Postgres作为数据库,Sequelize作为ORM。

我有两个型号,User和Post。帖子属于用户,用户可以有很多帖子。每个帖子都有一个类型,可以是1,2或3。

我想访问每个用户的姓名和他有多少帖子,按类型划分。

响应应该是这样的:

{
  "name": "John",
  "typeOne": 1,
  "typeTwo": 3,
  "typeThree": 5
}

我目前的代码如下:

router.route('/:id').get(async (req, res) => {
  const user = await User.findOne({
    where: { id: req.params.id },
      include: {
        model: Post,
        where: { type: 1 }
      }
    });
  const typeTwo = await User.findOne({
    where: { id: req.params.id },
      include: {
        model: Post,
        where: { type: 2 }
      }
    });
  const typeThree = await User.findOne({
    where: { id: req.params.id },
      include: {
        model: Post,
        where: { type: 3 }
      }
    });

    res.send({
      name: user.first_name,
      typeOne: user.posts.length,
      typeTwo: typeTwo.posts.length,
      typeThree: typeThree.posts.length });
  })

我得到了正确的答案,但我认为这段代码可以写得更好。编译它需要花费很多时间。我怎样才能获得总数?

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以使用groupbycount

User.findAll({
    where: { id: req.params.id },
    attributes: {
        include: ['name', 'posts.type', [Sequelize.fn("COUNT", Sequelize.col("posts.type")), "postsCount"]] 
    },
    include: [{
        model: Post, attributes: []
    }],
    group: ['model.type'] // also try, group: ['Post.type']
});