24

我有以下模式:

// 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并且有一个 UI,用户可以在其中为他们的汉堡选择一组配料。然后,我尝试将汉堡订单保存orders在同一数据库中的另一个集合中,burgers如下所示:

// 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' }

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

PS:req.body.ingredients 是一个由复选框构建的数组。

4

1 回答 1

24

您的代码现在可能存在 2 个问题:

1.req.body.ingredients不会是ObjectIds 的数组,猫鼬希望它没问题(我对此表示怀疑)。

你应该把每一种成分都ObjectId放在第一位。假设req.body.ingredients是数组,那么你会做这样的事情:

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

我没有测试过这个,看看它是否适合你。

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

ObjectId应该由 24 个十六进制字符组成,检查您是否将这样的值传递给 Mongoose。


如果其中一个对您有用,请发布结果:)

于 2013-05-22T20:11:42.710 回答