NestJs MongoDB Query Builder


Mongoose का Query Builder एक flexible API provide करता है जिससे आप MongoDB के powerful queries को chain कर सकते हैं। यह आपको data manipulate करने के लिए CRUD (Create, Read, Update, Delete) और complex operations जैसे aggregation और lookup को perform करने कि सुविधा देता है।

Mongoose Query Builder के through आप -

  • Records retrieve कर सकते हैं with filtering, sorting, and pagination.

  • Records update कर सकते हैं specific conditions के साथ।

  • Records delete कर सकते हैं।

  • Aggregations जैसे operations कर सकते हैं for complex data processing.

  • Lookups कर सकते हैं जो MongoDB के version 3.2 के बाद introduced "Joins" जैसा काम करते हैं।

अब हम अलग-अलग operations को implement करना सीखेंगे।

हालाँकि हम पहले ही Collection/Entity बनाना और उसमे data insert करने के साथ - साथ Retrieve करना भी सीखा था। इस topic में हम update , delete , lookup etc देखेंगे।

NestJs MongoDB Update Records

MongoDB में records को update करने के लिए आप Mongoose के findByIdAndUpdate(), updateOne(), या updateMany() methods का use कर सकते हैं।

File : src/user/user.service.ts

import { Injectable } from '@nestjs/common'; import { InjectModel } from '@nestjs/mongoose'; import { Model } from 'mongoose'; import { User } from './schemas/user.schema'; @Injectable() export class UserService { constructor(@InjectModel(User.name) private userModel: Model<User>) {} // Update user by ID async updateUserById(id: string, updateUserDto: any): Promise<User> { return this.userModel.findByIdAndUpdate(id, updateUserDto, { new: true }).exec(); } // Update user by email async updateUserByEmail(email: string, updateUserDto: any): Promise<User> { return this.userModel.updateOne({ email }, updateUserDto, { new: true }).exec(); } }

यहां -

  • findByIdAndUpdate() method का use करके हम specific ID के basis पर एक user record को update कर रहे हैं।

  • updateOne() का use करके हम एक user को email के basis पर update कर रहे हैं।

Options

  • { new: true } : इससे MongoDB updated document को return करेगा instead of थे old one.

NestJs MongoDB Delete Records

Records को delete करने के लिए Mongoose के पास methods जैसे findByIdAndDelete(), deleteOne(), और deleteMany() होते हैं।

File : src/user/user.service.ts

@Injectable() export class UserService { constructor(@InjectModel(User.name) private userModel: Model<User>) {} // Delete user by ID async deleteUserById(id: string): Promise<User> { return this.userModel.findByIdAndDelete(id).exec(); } // Delete user by email async deleteUserByEmail(email: string): Promise<any> { return this.userModel.deleteOne({ email }).exec(); } }

यहां

  • findByIdAndDelete() का use करके हम specific ID के basis पर user को delete कर रहे हैं।

  • deleteOne() का use करके हम user को email के basis पर delete कर रहे हैं।

NestJs MongoDB Aggregation Pipeline

Aggregation एक powerful tool है जो MongoDB को structured और analyzed data retrieve करने में help करता है। Aggregation का use करते हुए आप group, filter, sort, और calculate कर सकते हैं data को एक structured form में।

Example : Aggregation for User Data Analysis

File : src/user/user.service.ts

@Injectable() export class UserService { constructor(@InjectModel(User.name) private userModel: Model<User>) {} // Aggregation to calculate average age of users async calculateAverageAge(): Promise<any> { return this.userModel.aggregate([ { $group: { _id: null, averageAge: { $avg: "$age" } } } ]).exec(); } // Aggregation to get users grouped by age async groupUsersByAge(): Promise<any> { return this.userModel.aggregate([ { $group: { _id: "$age", users: { $push: "$$ROOT" } } } ]).exec(); } }

Example में -

  • $group aggregation stage का use करके हम users को age के basis पर group कर रहे हैं।

  • $avg operator का use करके average age calculate कर रहे हैं।

Mongo Aggregation Pipeline Stages

  • $match : Filtering करने के लिए।

  • $group : Data को group करने के लिए।

  • $project : Specific fields को include/exclude करने के लिए।

  • $sort : Data को sort करने के लिए।

  • $limit : Data को limit करने के लिए।

NestJs MongoDB Join Example

MongoDB में joins को lookup के साथ implement किया जा सकता है। यह तब useful होता है जब आपको दो या ज़्यादा collections को join करना हो।

Example : Lookup Between User and Profile Collection

File : src/user/user.service.ts

Suppose हमारे पास एक Profile collection है जो User collection के साथ related है।

@Injectable() export class UserService { constructor(@InjectModel(User.name) private userModel: Model<User>) {} // Perform a lookup between User and Profile async lookupUserProfiles(): Promise<any> { return this.userModel.aggregate([ { $lookup: { from: 'profiles', // Name of the profile collection localField: '_id', // Field from User collection foreignField: 'userId', // Field from Profile collection as: 'profileInfo' // Alias for joined data } } ]).exec(); } }

यहां

  • $lookup का use करके हम User collection को Profile collection के साथ join कर रहे हैं।

  • from : जो collection join करनी है।

  • localField : जो field join के लिए use होगी from User.

  • foreignField : जो field Profile collection से join होगी।

  • as : Joined data को profileInfo के alias के साथ return करेंगे।

Hey ! I'm Rahul founder of learnhindituts.com. Working in IT industry more than 4.5 years. I love to talk about programming as well as writing technical tutorials and blogs that can help to others .... keep learning :)

Get connected with me - LinkedIn Twitter Instagram Facebook