【问题标题】: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(); 之类的失败吗?

标签: node.js mongodb mongoose


【解决方案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-sparsehttp://docs.mongodb.org/manual/core/index-sparse/ 了解更多信息

    【讨论】:

    • 问题中定义的文档应该仍然能够拥有未定义的开发人员,而无需创建稀疏索引。
    猜你喜欢
    • 2015-07-13
    • 2016-10-10
    • 2020-01-16
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    • 2015-07-13
    • 2020-01-17
    相关资源
    最近更新 更多