2015-10-15 3 views
0

Я создаю приложение с обычным стеклом с выражением и мангустом. У меня есть две схемы, userSchema и courseSchema:Разрешить пользователям добавлять элементы в свои профили Mongoose

var mongoose = require('mongoose'), 
      Schema = mongoose.Schema;  
    var courseSchema = mongoose.Schema({ 
     title:{type:String, required:'{PATH} is required!'}, 
     featured:{type:Boolean, required:'{PATH} is required!'}, 
     published:{type:Date, required:'{PATH} is required!'}, 
     courseLink:{type:String, required:'{PATH} is required!'}, 
     user: [{type:Schema.Types.ObjectId, ref : 'User'}] 

    }); 

var Course = mongoose.model('Course', courseSchema); 

module.exports = Course; 

var userSchema = mongoose.Schema({ 
     firstName: {type: String, required: true}, 
     lastName: {type: String, required: true}, 
     username: { 
        type: String, 
        required: true, 
        unique: true // creates unique index inside MongoDB   
     }, 
     salt: {type: String, required: true}, 
     hashed_pwd: {type: String, required: true}, 
     roles:[String], 
     courses:[{type: Schema.ObjectId, 
       ref: 'Course' }] 
    }); 

Я могу создавать пользователей и и курсы (в качестве администратора). Теперь я хочу, чтобы каждый пользователь добавлял курс в свой список курсов (или просто нажмите кнопку «как» рядом с курсом, и этот курс будет добавлен в его профиль).

На стороне контроллера я попытался проверить идентификатор пользователя из сеанса, найти этого пользователя и добавить курс в свой документ. Но вот где я застрял,

exports.addMyCourse = function(req, res){ 
    console.log('user id', req.session.passport.user); 
    console.log('id', req.body._id); 
    var currentUserId = req.session.passport.user; 

    User.findOne({'_id':currentUserId}, function(err, doc){ 
     console.log(doc); 
    }); 

Большинство решений, на которые я смотрел, не совсем понятны. Любая помощь будет оценена по достоинству.

ответ

0

ПОСТАНОВИЛИ:

Я использовал $ addToSet, чтобы добавить объекты курса в массив курсов внутри модели User:

Это может быть полезно для людей, которые ищут подобный soutions:

Моих схемы пользователя :

var userSchema = mongoose.Schema({ 

     firstName: {type: String, required: true}, 
     lastName: {type: String, required: true}, 
     username: { 
        type: String, 
        required: true, 
        unique: true // creates unique index inside MongoDB   
     }, 
     salt: {type: String, required: true}, 
     hashed_pwd: {type: String, required: true}, 
     roles:[String], 
     courses:[{ 
      type:Schema.ObjectId, ref:'Course' 
     }] 
    }); 
var User = mongoose.model('User', userSchema); 

Моя схема курса: вар мангуст = требуется ('мангуст'), Schema = mongoose.Schema;

var courseSchema = mongoose.Schema({ 
    title:{type:String, required:'{PATH} is required!'}, 
    featured:{type:Boolean, required:'{PATH} is required!'}, 
    published:{type:Date, required:'{PATH} is required!'}, 
    courseLink:{type:String, required:'{PATH} is required!'} 
});  

var Course = mongoose.model('Course', courseSchema); 

Внутри моей папки контроллеров, у меня есть users.js и courses.js:

В файле courses.js я создал addMyCourses промежуточное программное обеспечение для обновления курсов массив пользовательской модели путем извлечения первого тока идентификатор пользователя из сеанса и использование $ addToSet для вставки объекта и одновременного исключения дубликатов. Кроме того, я убедился, что я добавляю только ObjectId-х курсов, а не весь документ, конечно, так что я не буду иметь проблем в будущем слишком много данных в одном документе:

exports.addMyCourse = function(req, res){ 
    var myCourse = { 
     title: req.body.title, 
     featured: req.body.featured, 
     published: req.body.published, 
     courseLink: req.body.courseLink 
    }; 

    var currentUserId = req.session.passport.user; 

    var courseId = req.body._id; 

    User.update({_id:currentUserId}, 
     {$addToSet: {"courses": courseId}}, 
     {safe: true, upsert: true, new : true}, 
     function(err, model) { 
      console.log(model); 
     } 
    ); 
}; 

Так как я только имел ObjectId портретируемого, курсы внутри массива курсов модели User, мне пришлось использовать метод population() mongoose для выполнения совместного запроса на обеих моделях, чтобы получить соответствующие документы курса идентификаторов.

В users.js файле:

exports.getUserCourses = function(req, res, next){ 
     var currentUserId = req.session.passport.user; 
    User.findById(currentUserId).populate('courses') 
    .exec(function(err, data){ 
     if(err) { 
     console.log(err); 
     } 
     console.log('user courses', data); 
     res.send(data); 
    }) 
    };