允许用户将项目添加到他们的个人资料 Mongoose
Allow users to add items to their profiles Mongoose
我正在使用 express 和 mongoose 构建一个 mean stack 应用程序。我有两个模式,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' }]
});
我能够创建用户和课程(作为管理员)。我现在想要做的是允许每个用户将一门课程添加到他的课程列表中(或者只需单击课程旁边的 'like' 按钮,该课程就会添加到他的个人资料中)。
在控制器方面,我尝试从会话中检查用户 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);
});
我看的大部分解决方案都不是很清楚这一点。任何帮助将不胜感激。
已解决:
我使用 $addToSet 将课程对象添加到用户模型中的课程数组中:
这可能对搜索类似解决方案的人有用:
我的用户架构:
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);
我的课程架构:
变种猫鼬=要求('mongoose'),
架构 = 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 中间件来更新用户模型的课程数组,方法是首先从会话中检索当前用户的 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);
}
);
};
由于我只有用户模型的课程数组中的课程的ObjectId,我不得不使用mongoose的populate()方法对两个模型进行联合查询,以便获得相应的课程文档ids.
在 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);
})
};
我正在使用 express 和 mongoose 构建一个 mean stack 应用程序。我有两个模式,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' }]
});
我能够创建用户和课程(作为管理员)。我现在想要做的是允许每个用户将一门课程添加到他的课程列表中(或者只需单击课程旁边的 'like' 按钮,该课程就会添加到他的个人资料中)。
在控制器方面,我尝试从会话中检查用户 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);
});
我看的大部分解决方案都不是很清楚这一点。任何帮助将不胜感激。
已解决:
我使用 $addToSet 将课程对象添加到用户模型中的课程数组中:
这可能对搜索类似解决方案的人有用:
我的用户架构:
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);
我的课程架构: 变种猫鼬=要求('mongoose'), 架构 = 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 中间件来更新用户模型的课程数组,方法是首先从会话中检索当前用户的 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);
}
);
};
由于我只有用户模型的课程数组中的课程的ObjectId,我不得不使用mongoose的populate()方法对两个模型进行联合查询,以便获得相应的课程文档ids.
在 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);
})
};