MongoDBAdvanced
Mongoose Best Practices
প্রোডাকশন-ready Mongoose: connection reuse, lean(), naming, N+1 এড়ানো, security — বাংলায়।
13টি অংশবাংলা ভাষায়
১. Connection manage করুন
প্রতিটি request/function-এ নতুন connection খুলবেন না। একটা connection pool সারাজীবন activate রাখুন — serverless-এ global cache করুন (Next.js অধ্যায়টা দেখুন)।
২. lean() ব্যবহার
read-এ leanjs
js
// শুধু read/render করলে document method দরকার হয় না
const users = await User.find().lean();
// মাঝে document method (save, virtual) দরকার হলে lean NOT
const user = await User.findById(id);
user.name = "নতুন"; // document-এ modify
await user.save();৩. N+1 এড়ান
- লুপে
find()→ বদলেparallel/Promise.allবা এক query-তে$in - Reference-গুলো populate একবারে
select()দিয়ে অযথা field-না- Page-wise
limit/skip— limitless নয়
৪. Naming নিয়ম
| নিয়ম | উদাহরণ |
|---|---|
| Model name — Singular, PascalCase | User, BlogPost |
| Collection — plural (default) | users, blogposts |
| Field — camelCase | firstName, createdAt |
| Schema কনভেনশন | timestamps: true |
৫. Security
.env-এ secrets —NEXT_PUBLIC_দিয়ে client-এ পাঠাবেন নাfindByIdAndUpdate-এrunValidators: true- Query injection ঠেকাতে input validate করুন — user-controlled raw query object-কে সরাসরি filter হিসেবে ব্যবহার করবেন না
- Password/email-এ index + bcrypt hash
- API limit-এ
$lookup/aggregation-সহ complex query-র ট্র্যাক
৬. Mongoose + TypeScript
Typed model (v8)ts
ts
import { Schema, model, models, type Model } from "mongoose";
interface IUser {
name: string;
email: string;
age?: number;
}
const userSchema = new Schema<IUser>({
name: { type: String, required: true },
email: { type: String, required: true, unique: true },
age: Number,
});
// hot reload গার্ড
const User: Model<IUser> =
models.User || model<IUser>("User", userSchema);
export default User;আরেকটি গুরুত্বপূর্ণ
Error message ও UI-তে Bangla ব্যবহার করতে পারেন, কিন্তু field/mongoose naming বাংলা না — MongoDB ও JS-এর সাথে সামঞ্জস্যপূর্ণ ASCII name রাখুন। এতে aggregate/$project-সহ সব জায়গায় কম সমস্যা হয়।
শেষ প্যারায় নিজে practice করুন — কোড কপি করে নিজের এডিটরে চালিয়ে দেখুন।