2017-05-09 148 views
0

我正在创建一个应用程序,您在哪里记录锻炼,我在使用猫鼬时遇到了一些问题。猫鼬嵌套模式

我有两个模式,一个用于锻炼,一个用于锻炼。当用户添加一个新的练习时,我希望它被存储在锻炼内,而且我一直在用很多方式来尝试这个练习。

目前,该演习是保存在我的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); 

回答

1

根据您的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 
}) 
+0

谢谢!这让它工作 –

0

Workout.findById(req.params.id).populate("exercises").exec((err,workout) =>{ 
 
res.status(200).json(workout); 
 
})

应该以这种方式工作