var UserSchema = new Schema({
job : [{
type : mongoose.Schema.Types.ObjectId,
experience : String,
grade : String,
ref: 'Company'}]
});
用户可以有多个工作。当我向用户添加作业时,我喜欢这样:
如果我有:
req.body.job == {type : company._id, experience : "bla bla", grade : "smth"}
和
function addJob(req, res, next) {
var userId = req.user._id;
var job = req.body.job;
return User.findById(userId).exec()
.then(user => {
user.job.push(job);
return user.save()
.then(handleEntityNotFound(res))
.then(respondWithResult(res))
.catch(handleError(res));
});
}
我收到了一个错误:
Unhandled rejection CastError: Cast to ObjectId failed for value "[object Object]" at path "job"
但如果我这样做:
req.body.job == {type : company._id, experience : "bla bla", grade : "smth"}
带
function addJob(req, res, next) {
var userId = req.user._id;
var job = req.body.job;
return User.findById(userId).exec()
.then(user => {
user.job.push(job.type); // <----------
return user.save()
.then(handleEntityNotFound(res))
.then(respondWithResult(res))
.catch(handleError(res));
});
}
虽然有效,但experience
和grade
未定义。如何指定这些字段?
编辑:
所以我改变了UserSchema
,如:
var UserSchema = new Schema({
job : [{
_company : {
type : mongoose.Schema.Types.ObjectId,
ref: 'Company'
},
experience : String,
grade : String
}]
});
我试过了:
//req.body.job == {_company:{type : company._id}, experience : "bla bla", grade : "smth"}
function addJob(req, res, next) {
var userId = req.user._id;
var job = req.body.job;
return User.findById(userId).exec()
.then(user => {
user.job.push(job);
return user.save()
.then(handleEntityNotFound(res))
.then(respondWithResult(res))
.catch(handleError(res));
});
}
我从服务器
收到 500(内部服务器错误)错误BUT
//req.body.job == {_company:{type : company._id}, experience : "bla bla", grade : "smth"}
function addJob(req, res, next) {
var userId = req.user._id;
var job = req.body.job;
return User.findById(userId).exec()
.then(user => {
user.job.push(job._company); //<-----------------
return user.save()
.then(handleEntityNotFound(res))
.then(respondWithResult(res))
.catch(handleError(res));
});
}
无错误地工作。但是mongodb中的grade
和experience
字段仍然没有...
答案 0 :(得分:1)
字段&#34;类型&#34;由Mongoose保留,然后
{
type : mongoose.Schema.Types.ObjectId,
experience : String,
grade : String,
ref: 'Company'
}
描述了一个ObjectId类型的实体,引用了一个公司(这个实体与.populate一起使用)。不幸的是,由于它作为ObjectId保存在MongoDB中,因此其他字段将被忽略。
然后,您可以选择在其中一个字段中引用该公司,并且能够使用JobSchema检索额外的信息位,如:
{
_company : {type: mongoose.Schema.Types.ObjectId, ref: 'Company'}
experience : String,
grade : String
}
您将能够填充作业的_company字段,而不会失去&#34;体验&#34;和&#34;成绩&#34;信息
你的版本之后:
使用给定的JobSchema:
{
_company : {type: mongoose.Schema.Types.ObjectId, ref: 'Company'}
experience : String,
grade : String
}
你的工作实例应该看起来像{_company:ObjectId(&#34; .......&#34;),经验:&#34; blabla&#34;,年级:&#34; smth&# 34;}。然后你的req.body.job应该是{_company:company._id,经验:&#34; bla bla&#34;,年级:&#34; smth&#34;}
在你的第一个addJob中,你有一个500错误,因为你要求MongoDB将一个看起来像{type:ObjectId(&#34; ....&#34;)}的文档转换为ObjectId。
第二个addJob不会触发错误,因为您上传的文档看起来像{type:ObjectId(&#34; ...&#34;)}(并且会丢失成绩和经验字段方式)并且你的Schema字段都不是必需的,因此mongoose会忽略你的字段类型并将空对象上传到你的集合中。
TL; DR: 它应该是:
// req.body.job == {_company: company._id, experience : "bla bla", grade : "smth"}
function addJob(req, res, next) {
var userId = req.user._id,
job = req.body.job;
return User.findById(userId)
.exec()
.then(
user => {
user.job.push(job);
return user.save()
.then(handleEntityNotFound(res))
.then(respondWithResult(res))
.catch(handleError(res));
}
);
}