Получите доступ к глубоко вложенным свойствам в методе получения реального пути, ссылаясь на себя - PullRequest
0 голосов
/ 23 июня 2019

В моем приложении у меня три модели; 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.

...