# Mongoose — Elegant MongoDB Object Modeling for Node.js > A MongoDB object modeling library for Node.js that provides schema-based data validation, query building, and middleware hooks. ## Install Save as a script file and run: # Mongoose — Elegant MongoDB Object Modeling for Node.js ## Quick Use ```bash npm install mongoose ``` ```js import mongoose from 'mongoose'; await mongoose.connect('mongodb://localhost:27017/mydb'); const User = mongoose.model('User', { name: String, email: String }); await User.create({ name: 'Alice', email: 'alice@example.com' }); ``` ## Introduction Mongoose is the standard MongoDB ODM for Node.js. It provides a schema-based approach to modeling application data, with built-in type casting, validation, query building, and lifecycle hooks that bring structure to MongoDB's flexible document model. ## What Mongoose Does - Defines schemas with typed fields, defaults, validators, and indexes - Maps schemas to MongoDB collections via model classes with CRUD methods - Builds queries with a chainable API supporting filters, projections, and population - Runs middleware hooks before and after operations like save, remove, and validate - Populates references between documents similar to SQL joins ## Architecture Overview Mongoose wraps the official MongoDB Node.js driver with an abstraction layer. A Schema defines field types and validation rules. A Model compiles a schema against a collection and exposes static query methods. Documents are instances of models with getter/setter virtuals and instance methods. The connection manager handles replica sets, connection pooling, and automatic reconnection. Middleware chains execute pre/post hooks around document and query operations. ## Installation & Configuration - Install via npm alongside a running MongoDB instance or Atlas cluster - Connect with mongoose.connect() passing a connection URI and options - Define schemas using the Schema constructor with field type definitions - Compile schemas into models with mongoose.model() - Configure connection pool size, read preference, and write concern via options ## Key Features - Schema validation with built-in and custom validators at the field level - Population for joining documents across collections by reference - Middleware for pre/post hooks on save, validate, remove, and queries - Virtual properties for computed fields that do not persist to the database - Discriminators for single-collection inheritance patterns ## Comparison with Similar Tools - **MongoDB Driver** — lower-level with no schema enforcement; Mongoose adds structure and validation - **Prisma** — type-safe ORM with auto-generated client; Mongoose is MongoDB-specific with deeper Mongo integration - **TypeORM** — multi-database ORM; Mongoose is purpose-built for MongoDB with richer document features - **Drizzle ORM** — SQL-focused with type safety; Mongoose targets the document database paradigm - **Waterline** — multi-adapter ORM from Sails.js; Mongoose has a larger ecosystem and community ## FAQ **Q: Does Mongoose support TypeScript?** A: Yes. Mongoose 7+ includes built-in TypeScript support with generic type parameters for schemas and models. **Q: Can I use Mongoose with MongoDB Atlas?** A: Yes. Pass your Atlas connection string to mongoose.connect(). It works with any MongoDB 4.4+ deployment. **Q: How do I handle schema migrations?** A: MongoDB is schema-flexible so migrations are less common. Use mongoose-migrate or manual scripts for data transformations. **Q: What is population and when should I use it?** A: Population replaces a stored ObjectId with the full referenced document. Use it when you need related data without embedding. ## Sources - https://github.com/Automattic/mongoose - https://mongoosejs.com --- Source: https://tokrepo.com/en/workflows/50633f24-3ffb-11f1-9bc6-00163e2b0d79 Author: Script Depot