为什么需要Mongoose Populate?

时间:2015-03-25 21:43:23

标签: node.js mongodb mongoose

使用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),它可以让我保存文档。很奇怪。猜猜它只是认为它可以找到文件继续前进。想知道为什么这不会发生空白值。

2 个答案:

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