Главная/Статьи/Как работают Virtuals в Mongoose
MongoDB

Как работают Virtuals в Mongoose

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 }
});