2015-10-15 63 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的课程对象添加到用户模型中的课程数组:

这可能是人们寻找类似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); 

我的课程模式: VAR猫鼬=需要( '猫鼬'), 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的在用户模型的courses数组内部,我不得不使用mongoose的populate()方法在两个模型上进行联合查询,以便获得相应的ID的课程文档。

在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); 
    }) 
    }; 
相关问题