在猫鼬中引用另一个模式

时间:2021-01-22 16:52:14

标签: node.js mongodb mongoose

我正在创建一个带有 merng 堆栈的应用程序,该应用程序允许用户将他们为锻炼所做的设置记录到他们的帐户中。我目前正在研究猫鼬模式,并且有两个非常相似的模式,WorkoutExercise

models/Workout.js

const { model, Schema } = require("mongoose");

const workoutSchema = new Schema({
    workoutName: String,
    username: String,
    createdAt: Number,
    exercises: [
        {
            exerciseName: String,
            sets: [
                {
                    weight: Number,
                    reps: Number,
                    createdAt: Number,
                    notes: String
                }
            ]
        }
    ],
    notes: String
});

module.exports = model("Workout", workoutSchema);

模型/Exercise.js

const { model, Schema } = require("mongoose");

const exerciseSchema = new Schema({
    exerciseName: String,
    username: String,
    sets: [
        {
            weight: Number,
            reps: Number,
            createdAt: Number,
            notes: String
        }
    ]
});

module.exports = model("Exercise", exerciseSchema);

锻炼文档将仅包含一系列锻炼和锻炼期间记录的组(每次锻炼限制为 4 小时)。练习文档将包含用户在使用应用程序时记录的所有集合的数组。我面临的问题是,每当使用他们之前已经完成的练习创建新的锻炼文档时,它都会为该练习创建一个新 ID,而不是与练习文档中的 ID 相同。如果之前已记录,我希望锻炼文档识别出该锻炼的 ID 已存在。

经过研究,我认为我需要参考练习模式。但是,即使有了 SO 上的答案,我仍然不确定如何通过我的项目实现这一目标。

1 个答案:

答案 0 :(得分:0)

您可以通过 _id 引用并且不需要将整个对象 exercise 存储到 workout 集合中。

然后你可以使用 populate 定义为:

<块引用>

填充是用来自其他集合的文档自动替换文档中指定路径的过程。

因此,您的 workout 架构应该是:

const workoutSchema = new Schema({
    workoutName: String,
    username: String,
    createdAt: Number,
    exercises: [
        {
          type: mongoose.Schema.Types.ObjectId,
          ref: 'Exercise',
        }
    ],
    notes: String
});

使用此架构,您可以使用 populate()$lookup 进行“SQL 连接”以将所有值从 exercise 获取到 workout,其中 _id 是等于。您也可以使用其他字段进行比较。