NestJS — Node.js للمؤسسات

MongoDB مع Mongoose

17 دقيقة الدرس 25 من 30

MongoDB مع Mongoose

ليست كل التطبيقات تناسب قاعدة بيانات علائقية. MongoDB قاعدة بيانات مستندات تُخزّن مستندات مرنة شبيهة بـ JSON — ملائمة للمحتوى والكتالوجات والمخطّطات سريعة التطوّر. يدمجها NestJS عبر Mongoose، أشهر مكتبة MongoDB لـ Node.js، بحزمة @nestjs/mongoose.

تفكير SQL مقابل المستندات

في MongoDB تُخزّن مستندات في مجموعات (بدل صفوف في جداول). وغالبًا تُضمَّن البيانات المرتبطة داخل المستند بدل تقسيمها عبر جداول ووصلها — ما قد يجعل القراءات أسرع لكنه يغيّر كيفية نمذجة البيانات.

الاتصال

// npm install @nestjs/mongoose mongoose import { MongooseModule } from '@nestjs/mongoose'; @Module({ imports: [ MongooseModule.forRoot('mongodb://localhost/app'), ], }) export class AppModule {}

تعريف مخطّط

مع @nestjs/mongoose تُعرّف المخطّطات كأصناف باستخدام مُزخرِفَي @Schema() و@Prop() — مألوف بعد كيانات TypeORM:

import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose'; import { HydratedDocument } from 'mongoose'; export type UserDocument = HydratedDocument<User>; @Schema({ timestamps: true }) export class User { @Prop({ required: true }) name: string; @Prop({ required: true, unique: true }) email: string; @Prop({ default: true }) isActive: boolean; } export const UserSchema = SchemaFactory.createForClass(User);

تسجيل النموذج وحقنه

سجّل المخطّط بـ forFeature()، ثم احقن النموذج بـ @InjectModel():

// users.module.ts MongooseModule.forFeature([{ name: User.name, schema: UserSchema }]); // users.service.ts import { InjectModel } from '@nestjs/mongoose'; import { Model } from 'mongoose'; @Injectable() export class UsersService { constructor(@InjectModel(User.name) private userModel: Model<UserDocument>) {} async create(dto: CreateUserDto) { return new this.userModel(dto).save(); } findAll() { return this.userModel.find().exec(); } }
النموذج هو بوّابتك. يوفّر نموذج Mongoose الدوال find وfindById وcreate وupdateOne وdeleteOne وغيرها — مكافئ المستودع في قاعدة بيانات المستندات.

مقايضات تصميم المخطّط

  • التضمين — تخزين البيانات المرتبطة داخل المستند الأب. قراءات سريعة، لكن قد تكبر المستندات والبيانات المكرّرة أصعب تحديثًا.
  • الإشارة — تخزين معرّف والبحث عنه منفصلًا (كمفتاح أجنبي). مُطبَّع، لكن يحتاج استعلامًا إضافيًا (populate()).
بلا مخطّط لا يعني بلا تفكير. تُغري مرونة MongoDB الفِرَق بتخطّي نمذجة البيانات. أشكال المستندات غير المتّسقة تصبح كابوس صيانة. استخدم المخطّطات (كما أعلاه) ونمذِج أنماط وصولك بتعمّد.
اختر قاعدة البيانات للبيانات لا للضجيج. تتفوّق المخازن العلائقية في البيانات المهيكلة عالية الترابط ذات الاتساق القوي؛ وتتفوّق مخازن المستندات في البيانات المرنة غير المُطبَّعة كثيفة القراءة. يدعم NestJS كليهما بالقدر نفسه خلف أنماط الوحدة/الخدمة ذاتها.

الخلاصة

تُخزّن MongoDB مستندات مرنة في مجموعات، مدموجةً في NestJS عبر Mongoose و@nestjs/mongoose. عرّف المخطّطات بـ @Schema()/@Prop()، وسجّلها بـ forFeature()، واحقن Model مكتوب النوع بـ @InjectModel() للاستعلام والتثبيت. نمذِج التضمين مقابل الإشارة بتعمّد. بهذا تكتمل المرحلة الخامسة — تستطيع الآن تثبيت البيانات بقواعد علائقية ومستندية. تاليًا: المصادقة والتفويض.