在保存mongoose时用ObjectId引用文档

我有以下模式:

// ingredient var ingredSchema = new Schema({ name: String, cost: Number }); // order var orderSchema = new Schema({ cusName: String, ingredients: [{type: Schema.Types.ObjectId, ref: 'Ingredient'}] }); // create model var Ingredient = mongoose.model('Ingredient', ingredSchema); var Order = mongoose.model('Order', orderSchema); 

我已经在一个收集ingredients保存了一堆成分,并有一个用户界面,用户可以select一套汉堡的配料。 然后我尝试在同样的数据库burgers内保存另一个集合orders汉堡的orders ,如下所示:

 // get order info from the form var newOrder = new Order({ cusName: req.body.name, ingredients: req.body.ingredients }); newOrder.save(function(err) { if (err) return console.log('Could not save your new order', err); res.redirect('/order'); }); 

保存订单的调用会生成以下错误:

 { message: Cast to ObjectId failed for value xxx at path 'ingredients', name: 'CastError', type: ObjectId, value: xxx, path: 'ingredients' } 

我使用mongoose版本3.6.11。 请帮我破解这个。

PS:req.body.ingredients是从checkbox构build的数组。

您的代码现在有两个可能的问题:

1. req.body.ingredients不会是一个ObjectId的数组,并且mongoose希望它是好的(我怀疑这个)。

您应该先将每种成分都投射到ObjectId 。 假设req.body.ingredients是数组,那么你会做这样的事情:

 var casted = req.body.ingredients.map(function( ingredient ) { return mongoose.Types.ObjectId(ingredient); }); 

我没有testing过,看看它是否适合你。

2. Mongoose正在尝试投射您的成分,但其​​中一个不是有效的ObjectId

ObjectId应该由24个hex字符组成,检查你是否像这样将值传递给Mongoose。


请发布结果,如果他们中的一个为你工作:)