我正在创建一个健身应用程序,它有一个 struct :

用户有一个程序,程序有很多锻炼,锻炼有很多练习(M:M),锻炼有很多超集,超集有很多练习(M:M).

所以我有一个算法,创建有9个锻炼的程序,每个锻炼有6-8个锻炼,对于每个锻炼,我从数据库中找到一个合适的,并保存它与锻炼相关.因此,总的来说,我创建了一个计划,9个锻炼和54-72个练习.

然而,我花了20-25秒完成整个过程.这太过分了. 我try 使用RAW、属性选项.

以下是创建一次锻炼的算法.我在这里 Select 了不同的练习选项,但这应该不会太慢这个过程.您不需要了解模型中的字段是什么.我将非常感谢任何人的帮助,谢谢!

 public static async generateWorkout(body: WorkoutRequestApi, currentDay: number, workoutCounter: number) {

        let existing: string[] = [];
        let exercise: ExercisesModels | null;
        const workoutId: string = randomUUID();

        await Workout.create({
            uuid: workoutId,
            isFinished: false,
            programId: body.progId,
            type: body.programOptions.types[workoutCounter]
        })
        await Superset.create({uuid: workoutId})

        for (let i = 0; i < body.programOptions.workouts[currentDay].length; i++) {

            console.log("DAY: " + currentDay + " I: " + i)
            const currentExerciseModel = body.programOptions.workouts[currentDay][i];
            let unique: boolean = false;
            console.log(currentExerciseModel)

            if (currentExerciseModel.isSuperset) {

                while (!unique) {

                    const firstExercise: ExercisesModels | null = await ExerciseUtil.findWorkoutExercise(currentExerciseModel, currentExerciseModel.hasPriority ? true : false)
                    const secondExercise: ExercisesModels | null = await ExerciseUtil.findFixedExercise(body.programOptions.workouts[currentDay][i + 1])
                    if (firstExercise && secondExercise) {
                        if (!existing.includes(firstExercise.uuid)) {

                            unique = true
                            existing.push(firstExercise.uuid)
                            existing.push(secondExercise.uuid)

                            console.log("INSERTING " + firstExercise.uuid + " and " + secondExercise.uuid)

                            exercise = await this.modelToExercises(firstExercise, {
                                    reps: currentExerciseModel.reps,
                                    sets: currentExerciseModel.sets,
                                    order: i
                                }
                            )
                            console.log(exercise)
                            await SupersetExercise.create({
                                ExerciseUuid: exercise.uuid,
                                SupersetUuid: workoutId
                            })

                            exercise = await this.modelToExercises(secondExercise, {
                                    reps: currentExerciseModel.reps,
                                    sets: currentExerciseModel.sets,
                                    order: i+1
                                }
                            )
                            await SupersetExercise.create({
                                ExerciseUuid: exercise.uuid,
                                SupersetUuid: workoutId
                            })
                        }
                    }
                }


                i++;

                if (i >= body.programOptions.workouts[currentDay].length)
                    break

            } else {
                if (currentExerciseModel.isFixed === true) {
                    console.log("FIXED EXERCISE")
                    exercise = await ExerciseUtil.findFixedExercise(currentExerciseModel);

                    if (exercise) {
                        console.log("FOUND FIXED" + exercise.name)

                        exercise = await this.modelToExercises(exercise, {
                                reps: currentExerciseModel.reps,
                                sets: currentExerciseModel.sets,
                                order: i
                            }
                        )
                        try {
                            await WorkoutExercise.create({
                                WorkoutUuid: workoutId,
                                ExerciseUuid: exercise.uuid
                            });
                        } catch (e) {
                            console.log(<Error>e)
                        }


                    }


                } else {
                    while (!unique) {

                        exercise = await ExerciseUtil.findWorkoutExercise(currentExerciseModel, i <= 2)

                        if (exercise) {
                            if (!existing.includes(exercise.uuid)) {
                                unique = true
                                existing.push(exercise.uuid)


                                exercise = await this.modelToExercises(exercise, {
                                    reps: currentExerciseModel.reps,
                                    sets: currentExerciseModel.sets,
                                    order: i
                                })


                                try {
                                    await WorkoutExercise.create({
                                        WorkoutUuid: workoutId,
                                        ExerciseUuid: exercise.uuid
                                    });
                                } catch (e) {
                                    console.log(<Error>e)
                                }
                            }
                        }

                    }

                }


            }
        }

推荐答案

对于每一次While交互,您的代码偶然会命中数据库3次.做一些基本的计算,希望需要300毫秒(每个GIT 100毫秒),对于每3条记录,你将得到大约1秒的等待.

我的建议是,先获得这些记录,然后在内存中读取它们.我不是Superset方面的专家,但这是基本的数据库IO.

每次访问数据库时,您可以算作至少100ms的平均延迟,有时甚至更多.

我知道,一开始这似乎没有意义,因为在这种情况下,您会节省内存.如果您可以只过滤需要添加到该数组中的记录.有人曾告诉我:"调谐更像是一门艺术,而不是逻辑."LOL.

一个包含您需要的所有信息的单个请求将驯服大约120ms(多于一个),但它将在此过程中避免其他1000个请求.

Node.js相关问答推荐

使用prisma迁移到SQL失败

如何处理EPIPE时,使用axios并期待413响应?

正在try 使用Azure Function App上载文件时未上载文件(&Q;)

(0,core_1.default)不是使用@middy/core的lambda处理程序上的函数

如何在JavaScript中使用Mongoose将项推送到MongoDB中的重嵌套数组

PEAN auth 应用程序:为什么 Angular 拦截器总是使用BehaviorSubject 返回 null(即初始值),而不是更新后的值?

Mongodb - 在数组数组中查找()

Postgressql的BIGSERIAL自增序列,即使由于唯一约束错误没有创建行,也会自动增加

eSignature API 的 NodeJS SDK 是否支持数据流?

Typescript 正则表达式:过滤器返回空

使用 Nodejs 获取 Firebase 云消息传递历史记录

如何找到特定文档并更新数组中特定键的值?

获取用户 ID 后,Firebase 函数 onCreate 方法在 Firestore 上不起作用

mongoose.model() 方法返回未定义

在数组的另一个对象中获取数组的mongoose 对象

自定义 Docker 容器 Github 操作无法在 /github/workspace 中找到 Node 脚本

为什么我在生产环境中 deproy Next.js 示例项目时 CSS 不起作用?

如何将`yarn.lock`与`package.json`同步?

将 Heroku App 连接到 Atlas MongoDB 云服务

webpack-dev-server 找不到模块webpack