Node.js 为什么需要猫鼬?
使用猫鼬填充: 当我第一次创建文档时,mongoose强迫我为populate声明一个ref值,但在我的情况下,我还没有ref信息。当我试图创建一个新文档,同时提供一个空字符串时,我会进入我的开发者字段,我得到:Node.js 为什么需要猫鼬?,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,使用猫鼬填充: 当我第一次创建文档时,mongoose强迫我为populate声明一个ref值,但在我的情况下,我还没有ref信息。当我试图创建一个新文档,同时提供一个空字符串时,我会进入我的开发者字段,我得到: {"message":"Cast to ObjectId failed for value \"\" at path \"developer\"","name":"CastError","type":"ObjectId","value":"","path":"developer"}
{"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
});
基本上,我需要稍后设置,但它不可能像这样接缝。目前,我的解决办法是在以后使用虚拟用户填充它,但这并不理想
想法
更新
意识到如果我提供像值55132a418b3cde5546b01b37这样的对象id,它将允许我保存文档。很奇怪。我猜它只是认为它可以找到文档继续移动。想知道为什么空白值不会出现这种情况。您需要在模型中使用稀疏索引。 因此,有效的模型可以使developer等于零
var ProjectSchema = new Schema({
name: String,
status: {type:String, default:'pending'},
developer:{type: Schema.Types.ObjectId, ref: 'User', sparse:true},
type:String
});
看
和
有关其他信息,请参见错误消息中的说明。不能将空字符串保存在ObjectId的位置。该字段未列为“必需”,因此省略它并保存文档没有问题 代码更正:
// you can save this
var Project = {
name: 'Coolproject',
status: 'pending',
type: 'basic',
};
我不明白你的意思。它不允许您在不为开发人员定义用户的情况下创建文档吗?或者,它不允许您在用户模型不存在的情况下定义模式。人口与此有何关联?这个问题看起来很像X/Y。啊,是的,非常正确。希望更新后更清晰一点。我希望以后能够保存引用,而不是在我最初创建父文档时。在创建新文档时是否会发生此错误?您说的是保存,但如果您正在保存,则表示您至少能够在某个时候创建文档。你能包括导致这个错误的代码吗?我添加了我的模型以使它更清晰。是的,这是关于新文档创建的,它不允许我在不提供价值的情况下创建它。当我为文档提供id时效果很好,但当我将其留空时效果就不好了。您能否添加尝试创建/保存文档的部分并获取错误信息?你是说var p=新项目;p、 保存;失败?问题中定义的文档应该仍然能够有未定义的开发人员,而无需创建稀疏索引。