我对使用猫鼬的人口和子文档非常困惑,有谁能帮我理解背后的概念?请随时发布示例。
如果我不清楚,我不会对我感到恼火,我是新来的表达和mongodb,但我会尽力解释我尝试过的事情。完成。我要做的是创建一个新用户,并创建属于新用户的任务列表 。当我保存新用户时,它还会在任务中保存一系列任务:[] 。所以......我创建了一个用户架构,任务架构,创建视图和用户控制器。
这就是我所拥有的,而我现在已经失去了。获得了要保存的用户名,但任务为空。
我做错了什么?
模型/ user.js的
var mongoose = require('mongoose'),
Task = require('./Task'),
Schema = mongoose.Schema;
var userSchema = new Schema({
name: {
type: String,
unique: true
},
tasks: [Task]
});
module.exports = mongoose.model('User', UserSchema);
模型/ Task.js
var mongoose = require('mongoose'),
User = require('./User'),
Schema = mongoose.Schema;
var TaskSchema = new Schema({
title : String,
description : String,
complete : Boolean,
userID : {
type : Schema.ObjectId,
ref : 'User'
}
});
module.exports = mongoose.model('Task', TaskSchema);
视图/用户/ create.jade
block content
form(action='/user/save', method='POST')
input(type='text', name='title', id='title')
input(type='text', name='description', id='description')
input(type='checkbox', name='complete', id='complete')
button.btn(type='submit') Save
控制器/用户/ create.js
var User = require('../../models/User'),
Task = require('../../models/Task');
// CREATE
exports.get = function(req, res) {
res.render('user/create', {
title: 'Create User'
});
};
exports.post = function(req, res, next) {
var user = new User({
name: req.body.name,
title: req.body.title,
description: req.body.description,
complete: req.body.complete
});
User.findOne({name:req.body.name}, function(err, existing) {
if (err) {
return next(err);
}
user.save(function(err) {
if (err) {
return next(err);
}
res.redirect('/users');
});
});
};
控制器/用户/ edit.js
var User = require('../../models/User'),
Task = require('../../models/Task');
// EDIT
exports.get = function(req, res) {
User.findById(req.params.id, function(err, user) {
res.render('user/edit', {
user: user,
title: 'Edit User'
});
});
};
exports.post = function(req, res, next) {
User.findById(req.params.id, function(err, user) {
if (err) {
return next(err);
}
user.name = req.body.name || '';
user.title = req.body.title || '';
user.description = req.body.description || '';
user.complete = req.body.complete || '';
user.save(function(err) {
if (err) {
return next(err);
}
res.redirect('/users');
});
});
};
控制器/ routes.js
var create = require('./user/create'),
edit = require('./user/edit');
exports = module.exports = function(app) {
// Users
app.get('/user/create', create.get);
app.post('/user/save', create.post);
app.get('/user/edit/:id', edit.get);
app.post('/user/update/:id', edit.post);
};
答案 0 :(得分:2)
三件事:
<强>第一强>
您的模式将Task定义为嵌套在User中的内容,但您的表单和路由被设计为好像它们是同一个对象。更具体地说,这段代码:
user.name = req.body.name || '';
user.title = req.body.title || '';
user.description = req.body.description || '';
user.complete = req.body.complete || '';
user.save(function(err) {...
只会更改用户的名称,因为这是您触摸的唯一符合您的架构的字段:
var userSchema = new Schema({
name: {
type: String,
unique: true
},
tasks: [Task]
});
如果您想为该用户添加新任务,您可以这样做:
user.tasks.push({
title: req.body.title,
description: req.body.description,
complete: req.body.complete
})
user.save(function(err) {...
<强>第二强>
你的路线有点傻。例如,我希望路由POST /user/update/:id
仅接受用户属性,或接受任务作为数组。如果我想要为给定用户创建单独任务的路由,我会这样做:POST /user/:id/task
我会将任务直接推送到具有mongo查询的User.tasks上,如下所示:
// note that incoming data (req.params and req.body) should be validated by your controller, omitted here for brevity
User.update({_id: req.params.id}, {$push: {'tasks': req.body}}, function(err) {...})
<强>第三强>
在mongoose中,Schema(文档结构)和Model(具有自己的mongodb集合的东西,你可以实例化)之间存在差异。我不确定你是否打算将Tasks定义为自己的模型。你可能想要的是将任务嵌套在User.tasks中,在这种情况下你应该这样做:
var TaskSchema = new Schema({
title : String,
description : String,
complete : Boolean
});
var userSchema = new Schema({
name: {
type: String,
unique: true
},
tasks: [TaskSchema]
});
你没有 在用户中嵌套任务,另一种选择是将它们定义为mongo中的单独集合并让它们相互引用,就像你已经使用Task.userID
的方式一样。但我建议不要将这两种方法混合在一起。