在保存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。
请发布结果,如果他们中的一个为你工作:)