【问题标题】:return avg value in typeorm在 typeorm 中返回平均值
【发布时间】:2021-07-08 13:17:03
【问题描述】:

我在一个使用 typeorm 的项目中工作。 在我的项目中,我有这些实体: 课程.ts

export class Course extends DefaultBaseEntity {
    @Column({name: "course_name"})
    courseName: string;
    @Column({name:"discipline"})
    discipline: string;

    @Column({default: 0}) rating: number;
}

和 RatingsCourse.ts

export class CoursesRatings extends BaseEntity {
    @PrimaryGeneratedColumn({type: "bigint"})
    public id: number;

    // other columns defined here
    @Column({type: "bigint"})
    userId: number;

    @Column({type: 'bigint'}) courseId: number;

    @Column() rating: number;
}

每门课程都有评分的想法。当我添加新评分时,我想将 CoursesRatings 中的平均评分值保存在 Course 的评分字段中 我编写了这样的代码:

await CoursesRatings.create({
            courseId: ratingBody.courseId,
            userId: user.id,
            rating: ratingBody.rating
        }).save();
        const ratingsObjects = await CoursesRatings.find({
            where: {
                courseId: ratingBody.courseId,
                userId: user.id
            },
            select: ["rating"]
        });
        const ratings: number[] = ratingsObjects.map(x => x.rating);
        const avgRating = ratings.reduce((a, b) => a + b) / ratings.length;
        const course = await Course.findOne(ratingBody.courseId);
        course.rating = Math.fround(avgRating);
        await course.save();

但这需要一些时间。 我想知道如何优化这段代码。我很感激任何帮助。谢谢!

【问题讨论】:

  • CoursesRatings的插入上写一个数据库触发器怎么样?
  • 怎么做db触发器?你能给我看一些代码吗? @SohamLawar

标签: mysql node.js typescript typeorm


【解决方案1】:

实现这一点的一个可用选项是创建一个数据库触发器,如下所示 -

CREATE TRIGGER computeAvg
AFTER INSERT ON CoursesRatings
FOR EACH ROW
    UPDATE Course
    SET rating = (SELECT AVG(rating) FROM CoursesRatings
                         WHERE CoursesRatings.courseId = Course.id)
    WHERE id = NEW.courseId;    

如果为每个插入的用户评分更新课程评分证明成本太高,那么我建议安排一个 CRON 作业以在特定时间间隔(假设为 1 天)更新所有课程的课程评分。这样一来,与之前建议的方法相比,它在数据库操作方面的成本就会降低。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    • 2017-08-10
    相关资源
    最近更新 更多