我正在创建一个带有 merng 堆栈的应用程序,该应用程序允许用户将他们为锻炼所做的设置记录到他们的帐户中。我目前正在研究猫鼬模式,并且有两个非常相似的模式,Workout
和 Exercise
。
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 上的答案,我仍然不确定如何通过我的项目实现这一目标。
答案 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
是等于。您也可以使用其他字段进行比较。