Node.js10 min read

MongoDB with Mongoose in Node.js

Connect Node.js to MongoDB using Mongoose. Learn schemas, models, and CRUD operations.

Sarah Chen
December 19, 2025
0.0k0

MongoDB with Mongoose in Node.js

Mongoose is the most popular MongoDB library for Node.js. It adds schemas, validation, and more.

Setup

npm install mongoose

Connect to MongoDB

const mongoose = require('mongoose');

mongoose.connect('mongodb://localhost:27017/myapp')
  .then(() => console.log('Connected to MongoDB'))
  .catch(err => console.error('Connection error:', err));

Define a Schema

const userSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true,
    trim: true
  },
  email: {
    type: String,
    required: true,
    unique: true,
    lowercase: true
  },
  age: {
    type: Number,
    min: 0,
    max: 120
  },
  role: {
    type: String,
    enum: ['user', 'admin'],
    default: 'user'
  },
  createdAt: {
    type: Date,
    default: Date.now
  }
});

const User = mongoose.model('User', userSchema);

Create Documents

// Method 1: new + save
const user = new User({
  name: 'Alice',
  email: 'alice@example.com',
  age: 25
});
await user.save();

// Method 2: create
const user2 = await User.create({
  name: 'Bob',
  email: 'bob@example.com'
});

Read Documents

// Find all
const users = await User.find();

// Find with conditions
const admins = await User.find({ role: 'admin' });

// Find one
const user = await User.findOne({ email: 'alice@example.com' });

// Find by ID
const user = await User.findById('507f1f77bcf86cd799439011');

// Select specific fields
const users = await User.find().select('name email');

// Sort
const users = await User.find().sort({ createdAt: -1 });

// Limit
const users = await User.find().limit(10);

// Pagination
const page = 2;
const limit = 10;
const users = await User.find()
  .skip((page - 1) * limit)
  .limit(limit);

Update Documents

// Find and update
const user = await User.findByIdAndUpdate(
  '507f1f77bcf86cd799439011',
  { name: 'Alice Smith' },
  { new: true }  // Return updated document
);

// Update many
await User.updateMany(
  { role: 'user' },
  { $set: { verified: true } }
);

Delete Documents

// Delete one
await User.findByIdAndDelete('507f1f77bcf86cd799439011');

// Delete many
await User.deleteMany({ role: 'guest' });

Schema Options

const postSchema = new mongoose.Schema({
  title: String,
  content: String,
  author: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'User'  // Reference to User model
  },
  tags: [String],  // Array of strings
  metadata: {
    views: { type: Number, default: 0 },
    likes: { type: Number, default: 0 }
  }
}, {
  timestamps: true  // Adds createdAt, updatedAt
});

Populate (Join)

// Get posts with author details
const posts = await Post.find()
  .populate('author', 'name email');

// Result includes full author object
// { title: '...', author: { name: 'Alice', email: '...' } }

Instance Methods

userSchema.methods.getPublicProfile = function() {
  return {
    id: this._id,
    name: this.name,
    email: this.email
  };
};

const user = await User.findById(id);
const profile = user.getPublicProfile();

Static Methods

userSchema.statics.findByEmail = function(email) {
  return this.findOne({ email });
};

const user = await User.findByEmail('alice@example.com');

Middleware (Hooks)

// Before saving
userSchema.pre('save', async function(next) {
  if (this.isModified('password')) {
    this.password = await bcrypt.hash(this.password, 10);
  }
  next();
});

// After saving
userSchema.post('save', function(doc) {
  console.log('User saved:', doc.email);
});

Express Integration

// models/User.js
const mongoose = require('mongoose');

const userSchema = new mongoose.Schema({
  name: { type: String, required: true },
  email: { type: String, required: true, unique: true }
});

module.exports = mongoose.model('User', userSchema);

// routes/users.js
const User = require('../models/User');

router.get('/', async (req, res) => {
  const users = await User.find();
  res.json(users);
});

router.post('/', async (req, res) => {
  const user = await User.create(req.body);
  res.status(201).json(user);
});

Key Takeaway

Mongoose provides schemas for MongoDB. Define schemas with types and validation, create models, then use find/create/update/delete. Use populate for joins, middleware for hooks. It's the standard way to work with MongoDB in Node.js.

#Node.js#MongoDB#Mongoose#Database#Intermediate