В моем приложении у меня три модели; 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
недавно созданного DeviceLink
сохраняется как свойство link
обоих Device
s.
Ссылка используется для переопределения свойств: если Device
является slave
из DeviceLink
, на который ссылается его link
, его свойства owner
и managers
должны быть переопределены свойствами DeviceLink
с 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
документом owner
(то есть приведенный выше код возвращает null
, когда Device
равен slave
). Есть ли другой способ сделать это, например, используя определенный метод .find
? Проблема в том, что в методе получения реального пути модель Device
еще не скомпилирована, и поэтому я не могу просто вызвать Device.findOne
.