猫鼬嵌套模式
问题描述:
我正在创建一个应用程序,您在哪里记录锻炼,我在使用猫鼬时遇到了一些问题。猫鼬嵌套模式
我有两个模式,一个用于锻炼,一个用于锻炼。当用户添加一个新的练习时,我希望它被存储在锻炼内,而且我一直在用很多方式来尝试这个练习。
目前,该演习是保存在我的MongoDB中不同的集合(不知道这是否是做的最好的方式),我认为它应该保存workout.exercises内的运动,但只有objectID。我该如何解决这个问题?已经看过了填充函数,但无法弄清楚如何让它工作。
addExercises
export function addExercise(req, res) {
if (!req.body.exercise.title) {
res.status(403).end();
}
const newExercise = new Exercise(req.body.exercise);
// Let's sanitize inputs
newExercise.title = sanitizeHtml(newExercise.title);
newExercise.cuid = cuid();
newExercise.sets = [];
newExercise.save((err, saved) => {
if (err) res.status(500).send(err);
});
Workout
.findOneAndUpdate(
{cuid: req.body.exercise.workoutCUID},
{$push: {exercises: newExercise}},
{upsert: true, new: true},
function (err, data) {
if (err) console.log(err);
});
}
getExercises
export function getExercises(req, res) {
Workout.findOne({cuid: req.params.cuid}).exec((err, workout) => {
if (err) {
res.status(500).send(err);
}
console.log(workout);
let exercises = workout.exercises;
res.json({exercises});
});
}
锻炼
import mongoose from "mongoose";
const Schema = mongoose.Schema;
var Exercise = require('./exercise');
const workoutSchema = new Schema({
title: {type: 'String', required: true},
cuid: {type: 'String', required: true},
slug: {type: 'String', required: true},
userID: {type: 'String', required: true},
exercises: [{ type: Schema.Types.ObjectId, ref: 'Exercise' }],
date: {type: 'Date', default: Date.now, required: true},
});
export default mongoose.model('Workout', workoutSchema);
锻炼
import mongoose from "mongoose";
const Schema = mongoose.Schema;
var Workout = require('./workout');
const exerciseSchema = new Schema({
title: {type: 'String', required: true},
cuid: {type: 'String', required: true},
workoutCUID: {type: 'String', required: true},
sets: {type: 'Array', "default": [], required: true}
});
export default mongoose.model('Exercise', exerciseSchema);
答
根据您的Workout
模式,您声明Exercises
字段的类型是[{ type: Schema.Types.ObjectId, ref: 'Exercise' }]
。这意味着这个字段应该是一个Mongoose ObjectId的数组。
看来,你试图将整个exercise
对象添加到锻炼的exercises
领域,而不是仅仅的ObjectId。尝试修改这样说:
const newExercise = new Exercise(req.body.exercise);
// Let's sanitize inputs
newExercise.title = sanitizeHtml(newExercise.title);
newExercise.cuid = cuid();
newExercise.sets = [];
newExercise.save((err, saved) => {
if (err) res.status(500).send(err);
// Nest the Workout update in here to ensure that the new exercise saved correctly before proceeding
Workout
.findOneAndUpdate(
{cuid: req.body.exercise.workoutCUID},
// push just the _id, not the whole object
{$push: {exercises: newExercise._id}},
{upsert: true, new: true},
function (err, data) {
if (err) console.log(err);
});
});
现在你有正确的的ObjectId保存在演习现场,在查询锻炼.populate
应该工作:
Workout.findById(id).populate("exercises").exec((err, workout) => {
// handle error and do stuff with the workout
})
答
Workout.findById(req.params.id).populate("exercises").exec((err,workout) =>{
res.status(200).json(workout);
})
应该以这种方式工作
谢谢!这让它工作 –