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

Posted

技术标签:

【中文标题】在 mongoose 中保存时使用 ObjectId 参考文档【英文标题】:Reference documents with ObjectId when saving in mongoose 【发布时间】:2013-05-18 00:34:39 【问题描述】:

我有以下架构:

// 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 中保存了一堆配料,并且有一个用户界面,用户可以在其中为他们的汉堡选择一组配料。然后,我尝试在同一数据库 burgers 中的另一个集合 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' 

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

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

【问题讨论】:

【参考方案1】:

您的代码目前可能存在 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。


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

【讨论】:

我运行选项 1 并 express 抛出错误:Error: Argument passed in must be a single String of 12 bytes or a string of 24 hex characters。我仍在努力解决这个ObjectId 的问题。 好吧,现在检查选项 2。您可能没有传递有效的ObjectIds。 你明白了!选项二钉它。问题是我在req.body.ingredients 中填充了ingred.name 而不是ingred._id。感谢您的提醒。 对我来说很奇怪的是,当我查看数据库时,ObjectID 与我提供给程序的不同。例如,我希望它保存对成分123(即ObjectId(123))的引用,但在数据库中我认为它是一个完全不同的数字

以上是关于在 mongoose 中保存时使用 ObjectId 参考文档的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose,使用 $lookup 的聚合查询返回 null?

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

Mongoose - 删除子文档数组项

$ addToSet到一个数组,但它给我null

我无法使用 Mongoose 在 MongoDB 中保存或查找文档

使用 Mongoose.js 保存模型时,为啥会出现“无法调用未定义的 doValidate”?