Sequelize:聚合嵌套包含 (PostgreSQL)

问题描述 投票:0回答:1

在我的数据库中,我有以下相关表格:

users
listings
reviews

users
有很多
listings

listings
有很多
reviews

reviews
有一个列
value
,它是 0 到 5 之间的浮点数。

我希望能够对用户进行评分,其定义为:

用户拥有的

value
的所有
reviews
的平均
listings

在 Sequelize 中,我有这个:

User.findById(userId, {
  include: [
    {
      model: Listing,
      order: [
        [Review, 'updatedAt', 'desc']
      ],
      include: [
        {
          model: Review,
          include: [User]
        }
      ],
    }
  ]
})

这成功地让我:

  • 所有
    user
    字段
  • 用户拥有的所有
    listings
  • 所有
    reviews
    对于那些
    listings

此时我确实有足够的信息来计算

user
平均评分,但这是假设我从未对该查询中的
listings
reviews
的数量设置任何限制。为了使应用程序能够扩展,我需要限制,因此我必须能够使用聚合函数来计算
listing
user
的平均评级。

我对 Sequelize 和 SQL 总体来说还很陌生。我怎样才能做到这一点?

node.js postgresql express sequelize.js
1个回答
0
投票

已经快六年了,但这里是答案,以防有人需要。

假设(用户 <-> 列表)和(列表 <-> 评论)是多对多关联

const user = await User.findById(userId, {
    group: ['User.id'],
    attributes: {
        include: [
            [Sequelize.literal('AVG("listings->reviews"."value")'), 'avgReview'],
        ],
    },
    include: [
        {
           model: Listing,
           as: 'listings',
           attributes: [],
           through: { attributes: [] },
           include: [
               {
                   model: Review,
                   as: 'reviews',
                   attributes: [],
                   through: { attributes: [] },
               }
           ],
       }
    ]
});

这会从连接表和关联表的模型中删除属性,因此我们不必按它们进行分组。

attributes: [],
through: { attributes: [] },
© www.soinside.com 2019 - 2024. All rights reserved.