为啥需要猫鼬填充?
Posted
技术标签:
【中文标题】为啥需要猫鼬填充?【英文标题】:Why Mongoose Populate Required?为什么需要猫鼬填充? 【发布时间】:2015-05-29 19:11:39 【问题描述】:使用猫鼬填充: http://mongoosejs.com/docs/populate.html
当我第一次创建文档时,猫鼬迫使我为填充声明一个参考值,但在我的情况下,我还没有参考信息。当我尝试在提供一个空字符串的同时创建一个新文档时,我得到了我的开发人员字段:
"message":"Cast to ObjectId failed for value \"\" at path \"developer\"","name":"CastError","type":"ObjectId","value":"","path":"developer"
我通过猫鼬保存的对象:
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
);
基本上我需要稍后设置它,但它不像这样是可能的。目前我的解决方法是在稍后再填充一个虚拟用户,但这不太理想。
想法?
更新
意识到如果我提供一个对象 id 值 (55132a418b3cde5546b01b37),它可以让我保存文档。很奇怪。猜猜它只是认为它可以找到文档继续前进。想知道为什么对于空白值不会发生这种情况。
【问题讨论】:
我不明白你的意思。是不是让您在不为开发人员定义用户的情况下创建文档?还是不允许您在没有 User 模型的情况下定义架构。人口如何与此联系在一起?问题看起来很X/Y ish。 啊,是的,非常正确。更新它希望更清楚一点。我希望以后能够保存参考,而不是在我最初创建父文档时。 创建新文档时是否发生此错误?您说保存,但如果您正在保存,则表明您至少能够在某个时候创建文档。能否包含导致此错误的代码? 为了清晰起见,我添加了我的模型。是的,这是关于新文档的创建,它不允许我在不提供价值的情况下创建它。当我为文档提供 id 时效果很好,但当我把它留空时就不行了。 您可以添加您尝试创建/保存文档并收到错误的部分吗?你是在说var p = new Project(); p.save();
之类的失败吗?
【参考方案1】:
错误消息中解释了该问题。您不能保存 空字符串 来代替 ObjectId。该字段未列为'必填',因此将其保留并保存文档没有问题。
代码更正:
// you can save this
var Project =
name: 'Coolproject',
status: 'pending',
type: 'basic',
;
【讨论】:
【参考方案2】:你需要在模型中使用稀疏索引。
所以,有效模型可以有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/ 了解更多信息
【讨论】:
问题中定义的文档应该仍然能够拥有未定义的开发人员,而无需创建稀疏索引。以上是关于为啥需要猫鼬填充?的主要内容,如果未能解决你的问题,请参考以下文章