保存在mongoose中时使用ObjectId的参考文档

gab*_*eno 24 mongoose mongodb node.js express

我有以下架构:

// 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);
Run Code Online (Sandbox Code Playgroud)

我已经在一个系列中保存了一堆成分,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');
});
Run Code Online (Sandbox Code Playgroud)

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

{ message: Cast to ObjectId failed for value xxx at path 'ingredients',
  name: 'CastError',
  type: ObjectId,
  value: xxx,
  path: 'ingredients' }
Run Code Online (Sandbox Code Playgroud)

我使用mongoose版本3.6.11.请帮我解决这个问题.

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

gus*_*nke 24

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

1. req.body.ingredients不会是一个ObjectIds 的数组,而且mongoose希望它没问题(我怀疑这个).

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

var casted = req.body.ingredients.map(function( ingredient ) {
  return mongoose.Types.ObjectId(ingredient);
});
Run Code Online (Sandbox Code Playgroud)

我没有对此进行测试,看看它是否适合你.

猫鼬正在试图铸造你的食材,但其中一种不是有效的 ObjectId

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


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

  • 你说对了!选项二指甲.问题是我在`req.body.ingredients`而不是`ingred._id`中填充了`ingred.name`.谢谢你的提醒. (3认同)