在我的应用程序中,我有三个模型; Device
,DeviceLink
和User
,由以下所述的模式定义:
const deviceSchema = new Schema({
link: {
type: Schema.Types.ObjectId,
ref: 'DeviceLink'
},
owner: {
type: Schema.Types.ObjectId,
ref: 'User'
},
managers: [
{
type: Schema.Types.ObjectId,
ref: 'User'
}
]
})
const deviceLinkSchema = new Schema({
master: {
type: Schema.Types.ObjectId,
ref: 'Device',
required: true
},
slaves: [
{
type: Schema.Types.ObjectId,
ref: 'Device'
}
]
})
const userSchema = new Schema({
email: {
type: String,
required: true
}
})
其工作原理如下:通过创建一个Device
(其中一个为Device
)可以将一个DeviceLink
链接到另一个master
。 slaves
个数组。此外,新创建的ObjectID
的{{1}}被存储为两个DeviceLink
的{{1}}属性。
该链接用于属性覆盖:如果link
是Device
所引用的Device
的{{1}},则其属性slave
和{ {1}}应该被DeviceLink
的{{1}}覆盖。
我目前尝试实现此目的的实现方法是使用覆盖这些属性的实路径获取器,例如
link
但是,owner
函数无法按预期运行,并且不会使用其managers
文档填充DeviceLink
(这意味着当{{ 1}}是master
)。是否有其他方法可以做到这一点,例如通过使用特定的deviceSchema.path('owner').get(function(value) {
if (
!this.link ||
this.link.master._id.toString() === this._id.toString()
) {
// Not linked or is master of DeviceLink
return value
}
const masterDevice = this.link.populate({
path: 'master',
model: 'Device',
populate: {
path: 'owner',
model: 'User',
},
}).master
return masterDevice.owner
})
方法?问题在于,在实路径获取器中,.populate
模型尚未编译,因此我不能简单地调用this.link.master
。