Làm việc với MongoDB trong Node.js bằng Mongoose

Tạo bởi Hoàng Vũ, chỉnh sửa cuối lúc 31 tháng 1, 2025

1. Giới thiệu về MongoDB và Mongoose

MongoDB là gì?

MongoDB là một hệ quản trị cơ sở dữ liệu NoSQL, sử dụng cấu trúc document-oriented thay vì bảng như SQL. Dữ liệu trong MongoDB được lưu dưới dạng JSON/BSON, linh hoạt và phù hợp cho các ứng dụng web hiện đại.

Mongoose là gì?

Mongoose là một thư viện ODM (Object Data Modeling) cho MongoDB và Node.js, giúp:

  • Định nghĩa schema cho MongoDB.
  • Hỗ trợ các phương thức CRUD dễ sử dụng.
  • Cung cấp các middleware và validation mạnh mẽ.

2. Cài đặt MongoDB và Mongoose

a. Cài đặt MongoDB

b. Cài đặt Mongoose trong dự án Node.js

Chạy lệnh:

npm install mongoose

3. Kết nối MongoDB với Node.js

Tạo một file database.js để thiết lập kết nối với MongoDB:

const mongoose = require('mongoose');

// Kết nối tới MongoDB
mongoose.connect('mongodb://127.0.0.1:27017/my_database', {
    useNewUrlParser: true,
    useUnifiedTopology: true
})
.then(() => console.log('Kết nối MongoDB thành công!'))
.catch(err => console.error('Lỗi kết nối MongoDB:', err));

module.exports = mongoose;
  • mongodb://127.0.0.1:27017/my_database: Chuỗi kết nối tới MongoDB.
  • useNewUrlParser, useUnifiedTopology: Các tùy chọn để đảm bảo kết nối ổn định.

4. Tạo Model trong Mongoose

Model trong Mongoose giúp định nghĩa cấu trúc dữ liệu lưu trong MongoDB.

Tạo thư mục models/ và file User.js:

const mongoose = require('../database');

// Định nghĩa schema cho User
const userSchema = new mongoose.Schema({
    name: { type: String, required: true },
    email: { type: String, required: true, unique: true },
    age: { type: Number, required: true }
});

// Tạo model User từ schema
const User = mongoose.model('User', userSchema);

module.exports = User;
  • name, email, age: Các trường trong collection users.
  • required: true: Trường bắt buộc.
  • unique: true: Đảm bảo email không bị trùng lặp.

5. Thao tác CRUD (Create, Read, Update, Delete)

Tạo file app.js để viết các thao tác với MongoDB.

a. Thêm dữ liệu (Create)

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

const createUser = async () => {
    try {
        const newUser = new User({
            name: 'Nguyễn Văn A',
            email: 'vana@example.com',
            age: 25
        });
        const savedUser = await newUser.save();
        console.log('Thêm user thành công:', savedUser);
    } catch (error) {
        console.error('Lỗi khi thêm user:', error);
    }
};

createUser();

b. Lấy dữ liệu (Read)

const getUsers = async () => {
    try {
        const users = await User.find();
        console.log('Danh sách users:', users);
    } catch (error) {
        console.error('Lỗi khi lấy danh sách users:', error);
    }
};

getUsers();

c. Cập nhật dữ liệu (Update)

const updateUser = async (email, newAge) => {
    try {
        const updatedUser = await User.findOneAndUpdate(
            { email: email }, // Điều kiện tìm kiếm
            { age: newAge }, // Cập nhật giá trị
            { new: true } // Trả về user sau khi cập nhật
        );
        console.log('User sau khi cập nhật:', updatedUser);
    } catch (error) {
        console.error('Lỗi khi cập nhật user:', error);
    }
};

updateUser('vana@example.com', 30);

d. Xóa dữ liệu (Delete)

const deleteUser = async (email) => {
    try {
        const deletedUser = await User.findOneAndDelete({ email: email });
        console.log('User đã bị xóa:', deletedUser);
    } catch (error) {
        console.error('Lỗi khi xóa user:', error);
    }
};

deleteUser('vana@example.com');

6. Kết hợp với Express để tạo API CRUD

Tạo một REST API sử dụng Express để thao tác với MongoDB.

a. Cài đặt Express

npm install express body-parser

b. Tạo server Express

Tạo file server.js:

const express = require('express');
const bodyParser = require('body-parser');
const User = require('./models/User');

const app = express();
app.use(bodyParser.json());

// API: Lấy danh sách user
app.get('/users', async (req, res) => {
    const users = await User.find();
    res.json(users);
});

// API: Thêm user mới
app.post('/users', async (req, res) => {
    try {
        const user = new User(req.body);
        await user.save();
        res.json(user);
    } catch (error) {
        res.status(400).json({ error: error.message });
    }
});

// API: Cập nhật user theo email
app.put('/users/:email', async (req, res) => {
    const { email } = req.params;
    const updatedUser = await User.findOneAndUpdate(
        { email: email }, 
        req.body, 
        { new: true }
    );
    res.json(updatedUser);
});

// API: Xóa user theo email
app.delete('/users/:email', async (req, res) => {
    const { email } = req.params;
    await User.findOneAndDelete({ email: email });
    res.json({ message: 'User đã bị xóa' });
});

// Khởi động server
app.listen(3000, () => {
    console.log('Server chạy tại http://localhost:3000');
});

7. Chạy ứng dụng

  1. Chạy MongoDB

    mongod --dbpath /path/to/data/db
    
  2. Chạy server

    node server.js
    
  3. Gửi request API bằng Postman hoặc cURL:

    • Lấy danh sách user:
      curl -X GET http://localhost:3000/users
      
    • Thêm user mới:
      curl -X POST http://localhost:3000/users -H "Content-Type: application/json" -d '{"name": "John", "email": "john@example.com", "age": 28}'
      
    • Cập nhật user:
      curl -X PUT http://localhost:3000/users/john@example.com -H "Content-Type: application/json" -d '{"age": 30}'
      
    • Xóa user:
      curl -X DELETE http://localhost:3000/users/john@example.com
      

8. Kết luận

  • MongoDB là cơ sở dữ liệu NoSQL mạnh mẽ, linh hoạt.
  • Mongoose giúp thao tác dữ liệu dễ dàng với mô hình ODM.
  • Kết hợp với Express, ta có thể xây dựng API CRUD nhanh chóng.
Website Logo

Với hơn 10 năm kinh nghiệm lập trình web và từng làm việc với nhiều framework, ngôn ngữ như PHP, JavaScript, React, jQuery, CSS, HTML, CakePHP, Laravel..., tôi hy vọng những kiến thức được chia sẻ tại đây sẽ hữu ích và thiết thực cho các bạn.

Bình luận

Website Logo

Chào, tôi là Vũ. Đây là blog hướng dẫn lập trình của tôi.

Liên hệ công việc qua email dưới đây.

lhvuctu@gmail.com

Chúng Tôi Trên

Bạn đang muốn học về lập trình website?

Bạn cần nâng cao kiến thức chuyên nghiệp hơn để nâng cao cơ hội nghề nghiệp? Liên hệ