使用mongoose populate: http://mongoosejs.com/docs/populate.html
当我第一次创建文档时,mongoose强迫我为populate声明一个ref值但是在我的情况下我还没有参考信息。当我尝试在提供空字符串的同时创建一个新文档时,我得到了我的开发人员字段:
{"message":"Cast to ObjectId failed for value \"\" at path \"developer\"","name":"CastError","type":"ObjectId","value":"","path":"developer"}
我通过mongoose保存的对象:
var Project = {
name: 'Coolproject',
status: 'pending',
developer: '',
type: 'basic',
};
Project.create(req.body, function(err, project) {
if(err) { return handleError(res, err); }
return
});
我的模特:
var ProjectSchema = new Schema({
name: String,
status: {type:String, default:'pending'},
developer:{type: Schema.Types.ObjectId, ref: 'User'},
type:String
});
基本上我需要稍后设置它,但它不会像这样可能。目前我的工作是使用虚拟用户填充它直到稍后,但这不太理想。
思想?
更新
意识到如果我提供像value这样的对象id(55132a418b3cde5546b01b37),它可以让我保存文档。很奇怪。猜猜它只是认为它可以找到文件继续前进。想知道为什么这不会发生空白值。
答案 0 :(得分:1)
错误消息中解释了该问题。您无法在ObjectId的位置保存空字符串。该字段未列为' required' ,因此将其退出并保存文档没有任何问题。
代码更正:
// you can save this
var Project = {
name: 'Coolproject',
status: 'pending',
type: 'basic',
};
答案 1 :(得分:-1)
您需要在模型中使用稀疏索引。
因此,有效模型的developer
等于nil
var ProjectSchema = new Schema({
name: String,
status: {type:String, default:'pending'},
developer:{type: Schema.Types.ObjectId, ref: 'User', sparse:true},
type:String
});
请参阅 http://mongoosejs.com/docs/api.html#schematype_SchemaType-sparse和 http://docs.mongodb.org/manual/core/index-sparse/ 了解更多信息