节点Mongoose,投射到ObjectId在path“PATH”上的值“N”失败

试图为Node Express应用程序设置一个mongoose数据库,我的一些文档有logging需要引用其他集合。

我知道Mongoose提供populate这种关系的populate方法,但是我很难设置它。 据我所知,我需要指定我的模式,因此…

 bookingSchema = mongoose.Schema _id: Number # Involved users __booker: {type: Schema.Types.ObjectId, ref: 'User'} 

…但是当我试图种子数据库__booker值,如1,2,3(所有这些都是在用户集合中的有效文档)获取错误…

Cast to ObjectId failed for value "3" at path "__booker"

我会假设整数或整数string应该很容易强制到一个ObjectId,但似乎无法得到这个工作。 我究竟做错了什么?

我已经写了这个问题,因为上面的情况冻结了我几个小时。 大量的刺激,事实certificate,解决scheme非常简单,在mongoose的内部,就像一个单一的class轮。 无法想象我是唯一一个遇到这个问题,因此发布了答案。

看起来,mongoose会不喜欢用_ids来铸造你的types。 如果他们正在创build数据库,而且这些数据库已经有了指定相互关系的值,那么人们很可能会遇到这个问题。 我试图用数字种子作为我参考其他模型的种子,因为我相信mongoose会将这种types转换为正确types的ID。 它不会。

如果用户看起来像这样…

 userSchema = mongoose.Schema _id: Number fname: String 

…你的post看起来像这样…

 postSchema = mongoose.Schema _id: Number __user: {type: Number, ref: 'User'} 

那么你需要把这个作为你的UserSchema。

 bookingSchema = mongoose.Schema _id: Number # Involved users __booker: {type: Number, ref: 'User'} 

注意这个types是Number ,而不是ObjectId 。 这将允许填充函数在模型实例上正确运行。

希望这有助于我打我的头靠在墙上!