Virtuals — это дополнительные поля модели, функционирующие подобно мутаторам в Laravel. Значение таких полей присваивается в специальной функции модели. Виртуальные свойства не сохраняются в базе данных — они существуют только логически и не записываются в коллекцию документа.
GET метод: объединение полей
Базовый пример — объединение имени и фамилии в полное имя:
userSchema.virtual('fullname').get(function() {
return this.first + ' ' + this.last;
});
Другие применения GET метода: извлечение первого изображения из галереи для обложки, форматирование дат, создание тизеров статей.
SET метод: разделение строки
SET метод позволяет разделить строку на отдельные значения при записи:
userSchema.virtual('fullname').set(function(name) {
var split = name.split(' ');
this.first = split[0];
this.last = split[1];
});
Ограничения
Виртуальные поля недоступны для построения запросов в Mongoose. Их нельзя использовать в find(), where() и подобных методах. Однако их можно обрабатывать на фронтенде или бэкенде после извлечения данных из базы.
Чтобы виртуальные поля включались в toJSON() и toObject(), нужно включить соответствующую опцию в схеме:
const userSchema = new Schema({ ... }, {
toJSON: { virtuals: true },
toObject: { virtuals: true }
});