【问题标题】:Referencing another schema in mongoose在猫鼬中引用另一个模式
【发布时间】:2021-01-22 16:52:14
【问题描述】:

我正在使用 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);

models/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 的答案,我仍然不确定如何通过我的项目实现这一目标。

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    您可以通过_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 等于。您也可以使用其他字段进行比较。

    【讨论】:

    • 谢谢,但我想知道这会将用户名字段包含在我的锻炼文档中吗?
    猜你喜欢
    • 2021-08-17
    • 2020-01-05
    • 2020-12-16
    • 2015-05-15
    • 1970-01-01
    • 1970-01-01
    • 2021-05-24
    • 2018-10-13
    • 2020-08-01
    相关资源
    最近更新 更多