Привет! Сегодня мы собираемся углубиться в захватывающий мир NestJS и Mongoose, уделив особое внимание виртуальным схемам. Так что хватайте свое программирующее оборудование и приступайте!
Теперь вам может быть интересно, что же такое виртуалы? Что ж, в контексте Mongoose и NestJS виртуальные поля — это дополнительные поля, которые вы можете определить в своей схеме. Эти поля не сохраняются в базе данных, но к ним можно получить доступ, как если бы они были реальными свойствами ваших документов. Они предоставляют мощный способ создания связей и вычисления производных значений в вашем приложении.
Для начала предположим, что у нас есть две схемы Mongoose: UserSchema
и PostSchema
. Мы хотим установить связь между пользователем и его сообщениями. Вот как вы можете использовать виртуальные машины для достижения этой цели:
import { Schema, Prop, SchemaFactory } from '@nestjs/mongoose';
import { Document } from 'mongoose';
@Schema()
export class User {
@Prop()
name: string;
// ...
@Prop()
email: string;
}
export type UserDocument = User & Document;
export const UserSchema = SchemaFactory.createForClass(User);
@Schema()
export class Post {
@Prop()
title: string;
// ...
@Prop({ type: Schema.Types.ObjectId, ref: 'User' })
userId: string;
}
export type PostDocument = Post & Document;
export const PostSchema = SchemaFactory.createForClass(Post);
PostSchema.virtual('user', {
ref: 'User',
localField: 'userId',
foreignField: '_id',
justOne: true,
});
В приведенном выше примере кода мы определяем виртуальное поле user
для PostSchema
. Это виртуальное поле устанавливает связь между моделями Post
и User
. localField
относится к полю в текущей схеме (PostSchema
), которое содержит ссылку, а foreignField
указывает на поле в модели, на которую ссылаются (UserSchema
), который содержит соответствующее значение.
Определив этот виртуальный элемент, вы теперь можете легко получить доступ к пользователю, связанному с публикацией:
const post = await PostModel.findOne({ _id: postId }).populate('user');
console.log(post.user.name); // Output: John Doe
Как видите, используя метод populate
, мы можем получить связанную модель пользователя и напрямую получить доступ к ее свойствам. Это упрощает работу со связями и позволяет избежать дополнительных запросов к базе данных.
Но подождите, это еще не все! Виртуальные объекты также можно использовать для вычисления и получения значений на основе других полей вашей схемы. Допустим, мы хотим добавить виртуальное поле для подсчета количества комментариев к посту. Вот как это можно сделать:
PostSchema.virtual('commentCount').get(function () {
return this.comments.length;
});
В этом примере мы определяем виртуальное поле с именем commentCount
, которое вычисляет длину массива comments
в PostSchema
. Затем вы сможете получить доступ к этому виртуальному полю, как и к любому другому свойству:
const post = await PostModel.findOne({ _id: postId });
console.log(post.commentCount); // Output: 42
С помощью виртуальных элементов вы можете создавать динамические поля, которые повышают функциональность и гибкость ваших схем.
Подводя итог, можно сказать, что виртуальные элементы в NestJS и Mongoose – это мощная функция, позволяющая устанавливать связи между моделями и вычислять производные значения. Они обеспечивают удобный способ работы со связанными данными и позволяют избежать дополнительных запросов. Независимо от того, создаете ли вы платформу для социальных сетей или систему для ведения блога, виртуальные средства могут улучшить ваши отношения в схеме.
Так что вперед, используйте виртуальные возможности в своих проектах NestJS и Mongoose и откройте для себя совершенно новый уровень совершенства схем!