【问题标题】:Allow users to add items to their profiles Mongoose允许用户将项目添加到他们的个人资料 Mongoose
【发布时间】:2016-01-13 18:32:42
【问题描述】:

我正在使用 express 和 mongoose 构建一个平均堆栈应用程序。我有两个架构,userSchema 和 courseSchema:

 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' }]
    });

我能够创建用户和课程(作为管理员)。我现在要做的是允许每个用户将课程添加到他的课程列表中(或者只需单击课程旁边的“喜欢”按钮,该课程就会添加到他的个人资料中)。

在控制器方面,我尝试从会话中检查用户 ID,找到该用户并将课程添加到他的文档中。但这就是我卡住的地方,

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);
  });

我查看的大多数解决方案对此都不是很清楚。任何帮助将不胜感激。

【问题讨论】:

    标签: angularjs node.js mongodb mean


    【解决方案1】:

    已解决:

    我使用 $addToSet 将课程对象添加到 User 模型中的课程数组中:

    这可能对搜索类似解决方案的人有用:

    我的用户架构:

    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 和 course.js:

    在 course.js 文件中,我创建了 addMyCourses 中间件来更新用户模型的课程数组,方法是首先从会话中检索当前用户的 id 并使用 $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);
            }
        );
    };
    

    由于我在 User 模型的课程数组中只有课程的 ObjectId,因此我不得不使用 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);
        })
      };
    

    【讨论】:

      猜你喜欢
      • 2017-11-10
      • 1970-01-01
      • 2011-05-20
      • 2015-10-08
      • 2023-04-10
      • 1970-01-01
      • 2020-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多