尝试为Node Express应用程序设置猫鼬数据库,我的一些文档有需要引用其他集合的记录。
我知道Mongoose提供了populate
方法来填充这些类型的关系,但是我很难设置它。在我看来,我需要这样指定我的模式…
bookingSchema = mongoose.Schema
_id: Number
# Involved users
__booker: {type: Schema.Types.ObjectId, ref: 'User'}
…但是当我尝试用__booker值(如1,2,3)为数据库播种时(所有这些都是User集合中的有效文档)得到错误…
Cast to ObjectId failed for value "3" at path "__booker"
我认为整型或整型字符串应该很容易被强制转换为ObjectId,但似乎无法使其工作。我做错了什么?
我写这个问题是因为上面的情况让我呆了几个小时。大量的刺激,结果证明解决方案很简单,在猫鼬文档中,就像一个单一的眼线。无法想象我是唯一一个遇到这种情况的人,因此发布了答案。
看起来mongoose不喜欢将类型转换为_ids。如果人们正在创建具有指定彼此关系的种子值的数据库,则可能会遇到此问题。我试图使用Number类型作为我对其他模型的引用,因为我相信mongoose会将其转换为id的正确类型。它不会。
如果一个用户看起来像这样…
userSchema = mongoose.Schema
_id: Number
fname: String
…你的帖子是这样的…
postSchema = mongoose.Schema
_id: Number
__user: {type: Number, ref: 'User'}
然后你需要给这个作为你的UserSchema。
bookingSchema = mongoose.Schema
_id: Number
# Involved users
__booker: {type: Number, ref: 'User'}
注意类型是Number,而不是ObjectId。这将允许填充函数在您的模型实例上正确地操作。
希望这对你有帮助,我要去碰壁了!