保存在mongoose参考列表

我有以下模式:

var TagSchema = new Schema({ name: { type: String, default: '' } }); var SnippetSchema = new Schema({ title: { type: String, default: '' }, tags: [{ type: Schema.ObjectId, ref: 'Tag' }] }); 

我创build了一个新的Snippet并search一个标签(从请求中获取标签),将其添加到标签列表中。

 var snippet = new Snippet(req.body); Tag.findById(req.body.tagid).exec(function(err, tag) { snippet.tags.push(tag); snippet.save(function(err) { if (err) { } else { res.json(snippet); } }); }); 

但我总是得到以下错误: 投射到ObjectId失败的价值“[对象对象]”path“标签”

我试着把标签作为标签数组的一个标签instad,同样的事情 – 而且工作完美。

有没有人有一个想法?

非常感谢!

我很确定这个错误是由这一行引起的:

 var snippet = new Snippet(req.body); 

我的猜测是, req.body.tags是一个对象,而不是一个对象数组。 当您随后保存片段时,将引发错误。

作为一个快速修复,你可以用一个数组包装:

 var tags = req.body.tags; if (tags && tags.constructor.name !== 'Array') { req.body.tags = [ tags ]; } var snippet = new Snippet(req.body); 

编辑 :@ damphat正确地评论说,Mongoose将尝试和非数组的值转换为数组,如果这是模式中定义的。 但是,您仍然需要确保正在创build的数组是有效的。