Cơ bảncluster

MongoDB là gì? NoSQL khác SQL như thế nào? Hướng dẫn cho người mới

8 phút đọc0 lượt xem
#mongodb là gì#nosql là gì#mongodb vs mysql#học mongodb#cài đặt mongodb#mongodb atlas#document database#nosql database

MongoDB là gì? NoSQL khác SQL như thế nào? Hướng dẫn cho người mới

MongoDB là một cơ sở dữ liệu NoSQL dạng document, mã nguồn mở, do MongoDB Inc. phát triển. Dữ liệu được lưu dưới dạng tài liệu JSON (thực chất là BSON — Binary JSON) thay vì các bảng có hàng và cột như SQL. Ra mắt năm 2009, MongoDB hiện là một trong những NoSQL database phổ biến nhất thế giới, đặc biệt trong stack MERN (MongoDB, Express, React, Node.js).

Nếu bạn đã biết SQL là gì, hãy tưởng tượng: thay vì lưu dữ liệu vào bảng với các cột cố định, MongoDB lưu từng bản ghi dưới dạng một "tài liệu JSON" — linh hoạt, không cần khai báo cấu trúc trước. Chưa biết SQL? Đọc thêm bài SQL là gì? trước nhé.


// Ví dụ một document trong MongoDB (thông tin người dùng)
{
  "_id": "507f1f77bcf86cd799439011",
  "name": "Nguyễn An",
  "age": 22,
  "email": "an@example.com",
  "skills": ["Python", "JavaScript"],
  "address": {
    "city": "Hà Nội",
    "district": "Cầu Giấy"
  }
}
  

Document trên chứa tất cả thông tin của một người dùng trong một đối tượng JSON duy nhất — kể cả mảng (skills) và object lồng nhau (address). Đây là điểm khác biệt lớn so với SQL, nơi dữ liệu thường bị tách thành nhiều bảng.

NoSQL là gì? SQL và NoSQL khác nhau thế nào?

NoSQL là viết tắt của "Not Only SQL" — chỉ tất cả các loại cơ sở dữ liệu không dùng mô hình quan hệ truyền thống (relational). NoSQL không phải một loại duy nhất mà bao gồm nhiều mô hình khác nhau:

Loại NoSQL Mô tả Ví dụ
Document Lưu dữ liệu dạng JSON/BSON document MongoDB, Firestore
Key-Value Lưu cặp key-value đơn giản, tốc độ cao Redis, DynamoDB
Column-family Lưu theo cột, tối ưu cho phân tích dữ liệu lớn Cassandra, HBase
Graph Lưu quan hệ dạng node và cạnh Neo4j, ArangoDB

MongoDB thuộc loại Document database — phổ biến và dễ học nhất trong các loại NoSQL.

So sánh SQL và NoSQL

Tiêu chí SQL (MySQL, PostgreSQL…) NoSQL (MongoDB…)
Cấu trúc dữ liệu Bảng (hàng và cột) Document / Key-Value / Graph…
Schema Cố định, phải khai báo trước Linh hoạt, không cần khai báo
Ngôn ngữ truy vấn SQL chuẩn MQL (MongoDB) hoặc API riêng
Mở rộng (scaling) Chủ yếu vertical (nâng cấp server) Horizontal (sharding, thêm server)
JOIN Hỗ trợ mạnh Hạn chế ($lookup hoặc embed)
ACID transaction Đầy đủ Hỗ trợ từ MongoDB v4.0+
Độ khó học Trung bình (cần học SQL) Thấp-Trung (quen JSON là dùng được)

Không có loại nào "tốt hơn" tuyệt đối. Tuỳ từng bài toán mà lựa chọn phù hợp. Xem thêm bài Các lệnh SQL cơ bản để so sánh cú pháp trực tiếp.

Các khái niệm cơ bản trong MongoDB

Để học MongoDB nhanh nhất, hãy ánh xạ các khái niệm với SQL mà bạn đã biết:

SQL MongoDB Giải thích
Database Database Cùng khái niệm
Table (Bảng) Collection Tập hợp các document
Row (Hàng) Document Một bản ghi dạng JSON
Column (Cột) Field Một thuộc tính của document
Primary Key _id Tự động tạo bởi MongoDB
JOIN $lookup / Embed Lồng document hoặc dùng $lookup

Schema linh hoạt (Flexible Schema)

Điểm nổi bật nhất của MongoDB là schema linh hoạt: các document trong cùng một collection có thể có cấu trúc hoàn toàn khác nhau.


// Cả hai document này đều nằm trong collection "users"
// Document 1
{ "_id": 1, "name": "An", "age": 22, "email": "an@example.com" }

// Document 2 — thiếu "age", thêm "phone" và "city"
{ "_id": 2, "name": "Bình", "phone": "0901234567", "city": "HCM" }
  

Điều này giúp bạn phát triển nhanh mà không phải lo ALTER TABLE mỗi khi thêm trường mới. Tuy nhiên, cần cẩn thận khi đọc dữ liệu vì không có gì đảm bảo field luôn tồn tại.

Cài đặt MongoDB và MongoDB Atlas

Cách 1: MongoDB Atlas — Khuyên dùng cho người mới

MongoDB Atlas là dịch vụ MongoDB trên đám mây do MongoDB Inc. cung cấp. Free Tier M0 cho phép dùng 512MB miễn phí, vĩnh viễn, không cần thẻ ngân hàng.

  1. Truy cập mongodb.com/atlas và tạo tài khoản miễn phí
  2. Chọn "Build a Database" → chọn gói M0 Free
  3. Chọn Cloud Provider (AWS khuyên dùng) và Region Singapore (gần Việt Nam nhất)
  4. Tạo username và password cho database
  5. Thêm IP vào whitelist (dùng 0.0.0.0/0 khi phát triển)
  6. Sao chép Connection String:

mongodb+srv://username:password@cluster0.xxxxx.mongodb.net/mydb
  

Cách 2: Cài đặt local


# macOS — dùng Homebrew
brew tap mongodb/brew
brew install mongodb-community@7.0
brew services start mongodb-community@7.0

# Kiểm tra kết nối
mongosh
  

Trên Windows, tải installer từ trang chính thức của MongoDB và chạy trình cài đặt. Nên cài kèm MongoDB Compass (GUI miễn phí) để quản lý dữ liệu trực quan mà không cần gõ lệnh.

Các lệnh MongoDB cơ bản — CRUD

CRUD là viết tắt của Create (tạo), Read (đọc), Update (cập nhật), Delete (xóa) — 4 thao tác cơ bản nhất với mọi cơ sở dữ liệu.

MongoDB Shell


// Chọn database (tự động tạo nếu chưa có)
use mydb

// --- TẠO DỮ LIỆU (Create) ---
// Thêm 1 document
db.users.insertOne({ name: "Nguyễn An", age: 22, city: "Hà Nội" })

// Thêm nhiều document cùng lúc
db.users.insertMany([
  { name: "Trần Bình", age: 25, city: "HCM" },
  { name: "Lê Châu",   age: 20, city: "Đà Nẵng" }
])

// --- ĐỌC DỮ LIỆU (Read) ---
// Lấy tất cả
db.users.find({})

// Lọc theo điều kiện (age >= 20)
db.users.find({ age: { $gte: 20 } })

// Lấy 1 document đầu tiên khớp điều kiện
db.users.findOne({ name: "Nguyễn An" })

// Chỉ lấy một số field (projection)
db.users.find({}, { name: 1, city: 1, _id: 0 })

// --- CẬP NHẬT (Update) ---
// Cập nhật 1 document
db.users.updateOne(
  { name: "Nguyễn An" },   // điều kiện tìm
  { $set: { age: 23 } }    // nội dung cập nhật
)

// Cập nhật nhiều document
db.users.updateMany(
  { city: "Hà Nội" },
  { $set: { region: "North" } }
)

// --- XÓA (Delete) ---
// Xóa 1 document
db.users.deleteOne({ name: "Nguyễn An" })

// Xóa nhiều document (age < 18)
db.users.deleteMany({ age: { $lt: 18 } })
  

Node.js + Mongoose

Mongoose là thư viện ODM (Object Document Mapper) cho Node.js, giúp bạn định nghĩa schema, validation và middleware trên nền MongoDB. Đây là cách phổ biến nhất để dùng MongoDB trong stack MERN.


npm install mongoose
  

const mongoose = require('mongoose');

// --- Kết nối database ---
mongoose.connect('mongodb://localhost:27017/mydb')
  .then(() => console.log('Đã kết nối MongoDB'))
  .catch(err => console.error('Lỗi kết nối:', err));

// --- Định nghĩa Schema ---
const userSchema = new mongoose.Schema({
  name:  { type: String,  required: true },        // bắt buộc
  age:   { type: Number,  min: 0, max: 120 },      // validation số
  email: { type: String,  unique: true },           // không trùng
  city:  { type: String,  default: 'Hà Nội' },     // giá trị mặc định
  createdAt: { type: Date, default: Date.now }     // thời gian tạo
});

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

// --- Tạo mới ---
async function createUser() {
  const user = new User({
    name: 'Nguyễn An',
    age: 22,
    email: 'an@example.com'
  });
  await user.save();
  console.log('Tạo user thành công:', user);
}

// --- Tìm kiếm ---
async function getUsers() {
  const allUsers  = await User.find({});                       // tất cả
  const adults    = await User.find({ age: { $gte: 18 } });    // age >= 18
  const oneUser   = await User.findOne({ name: 'Nguyễn An' }); // 1 user
  return allUsers;
}

// --- Cập nhật ---
async function updateUser() {
  await User.updateOne(
    { name: 'Nguyễn An' },
    { $set: { age: 23 } }
  );

  // Tìm và cập nhật, trả về document mới
  const updated = await User.findOneAndUpdate(
    { email: 'an@example.com' },
    { $set: { city: 'HCM' } },
    { new: true }  // trả về bản sau khi cập nhật
  );
}

// --- Xóa ---
async function deleteUser() {
  await User.deleteOne({ name: 'Nguyễn An' });
  await User.findByIdAndDelete('507f1f77bcf86cd799439011');
}
  

Python + PyMongo

PyMongo là driver chính thức của MongoDB cho Python. Nếu bạn đang học Python, đây là cách nhanh nhất để kết nối với MongoDB. Xem thêm Python là gì? nếu bạn mới bắt đầu với Python.


pip install pymongo
  

from pymongo import MongoClient

# --- Kết nối ---
client = MongoClient("mongodb://localhost:27017/")
# Hoặc dùng Atlas connection string:
# client = MongoClient("mongodb+srv://user:password@cluster.mongodb.net/")

db         = client["mydb"]    # chọn database
collection = db["users"]       # chọn collection

# --- Thêm dữ liệu (Create) ---
# Thêm 1 document
result = collection.insert_one({
    "name": "Nguyễn An",
    "age": 22,
    "city": "Hà Nội"
})
print("ID vừa tạo:", result.inserted_id)

# Thêm nhiều document
collection.insert_many([
    {"name": "Trần Bình", "age": 25},
    {"name": "Lê Châu",   "age": 20}
])

# --- Tìm kiếm (Read) ---
# Lấy tất cả
for user in collection.find({}):
    print(user)

# Lọc điều kiện
adults = collection.find({"age": {"$gte": 18}})

# Tìm 1 document
user = collection.find_one({"name": "Nguyễn An"})

# --- Cập nhật (Update) ---
collection.update_one(
    {"name": "Nguyễn An"},   # điều kiện
    {"$set": {"age": 23}}    # cập nhật
)

# Cập nhật nhiều document
collection.update_many(
    {"city": "Hà Nội"},
    {"$set": {"region": "North"}}
)

# --- Xóa (Delete) ---
collection.delete_one({"name": "Nguyễn An"})
collection.delete_many({"age": {"$lt": 18}})

# Đóng kết nối
client.close()
  

Khi nào nên dùng MongoDB? Khi nào dùng SQL?

Dùng MongoDB khi:

  • Schema thay đổi thường xuyên — ví dụ: catalog sản phẩm thương mại điện tử (áo thì có size, sách thì có isbn, điện thoại thì có RAM)
  • Cần scale ngang với lượng dữ liệu lớn — MongoDB hỗ trợ sharding tốt, phù hợp cho ứng dụng xã hội, IoT, analytics real-time
  • Prototype nhanh — không cần khai báo schema trước, bắt đầu code ngay lập tức
  • Ứng dụng real-time — chat, notification, dashboard cập nhật liên tục
  • Dữ liệu dạng document tự nhiên — bài viết blog, profile người dùng, log hệ thống

Dùng SQL (MySQL/PostgreSQL) khi:

  • Quan hệ dữ liệu phức tạp, nhiều JOIN — hệ thống ngân hàng, ERP, CRM
  • Yêu cầu ACID transaction nghiêm ngặt — tài chính, kế toán, quản lý kho
  • Đội ngũ quen với SQL — không cần thay đổi nếu SQL đáp ứng được yêu cầu
  • Tính toàn vẹn dữ liệu cao — foreign key, CHECK constraint, trigger

Xem chi tiết hơn tại MySQL là gì?PostgreSQL là gì?. Để biết MongoDB thường được dùng trong dự án API như thế nào, đọc thêm API là gì?.

MongoDB vs MySQL vs PostgreSQL — So sánh chi tiết

Tiêu chí MongoDB MySQL PostgreSQL
Loại DB NoSQL (Document) SQL (Relational) SQL (Relational)
Schema Linh hoạt Cố định Cố định
Query Language MQL SQL SQL (mạnh nhất)
JOIN $lookup / Embed Có (toàn diện nhất)
ACID Từ v4.0+ Đầy đủ, mạnh nhất
Scale ngang Dễ (Sharding) Khó Trung bình
Use case chính Schema linh hoạt, big data Web app truyền thống Hệ thống phức tạp
Free cloud Atlas M0 (512MB) PlanetScale Free Supabase / Neon Free
Độ khó học Thấp–Trung Trung Trung–Cao

Gợi ý: Nếu bạn mới học lập trình, hãy bắt đầu với MySQL hoặc PostgreSQL để nắm vững SQL — kỹ năng này dùng được ở hầu hết công ty. Sau đó học MongoDB khi bạn làm dự án Node.js hoặc muốn khám phá NoSQL.

Câu hỏi thường gặp (FAQ)

MongoDB có miễn phí không?

Có. MongoDB là phần mềm mã nguồn mở (SSPL license), hoàn toàn miễn phí khi cài local. MongoDB Atlas Free Tier (M0) cũng miễn phí vĩnh viễn với 512MB storage, không cần thẻ ngân hàng.

MongoDB Atlas Free Tier có đủ dùng để học không?

Hoàn toàn đủ. 512MB là rất nhiều cho dự án học tập và side project cá nhân. Bạn có thể tạo nhiều collection, thực hành CRUD, và kết nối với ứng dụng web thực tế. Chỉ khi chạy production với hàng triệu bản ghi mới cần nâng cấp lên gói trả phí.

Nên học MongoDB hay MySQL trước?

Nếu mục tiêu là tìm việc làm, hãy học MySQL trước. Phần lớn công ty Việt Nam và toàn cầu vẫn dùng SQL (MySQL, PostgreSQL) cho hệ thống chính. SQL là kỹ năng "phải có". MongoDB nên học song song khi bạn làm dự án Node.js hoặc theo lộ trình MERN stack.

MongoDB có dùng được với Python không?

Có. Dùng thư viện PyMongo (đồng bộ) hoặc Motor (bất đồng bộ, dùng với FastAPI/asyncio). Cài đặt chỉ cần một lệnh: pip install pymongo. Xem thêm Python là gì?.

MongoDB có hỗ trợ transaction không?

Có, từ MongoDB 4.0 trở đi hỗ trợ ACID multi-document transaction. Tuy nhiên, transaction trong MongoDB phức tạp hơn và kém tối ưu hơn so với PostgreSQL. Nếu hệ thống của bạn cần transaction nghiêm ngặt (tài chính, kế toán), PostgreSQL vẫn là lựa chọn ưu tiên.

Học MongoDB ở đâu miễn phí?

MongoDB cung cấp MongoDB University hoàn toàn miễn phí tại learn.mongodb.com. Các khóa học từ beginner đến advanced, có cả chứng chỉ. Ngoài ra tài liệu chính thức tại mongodb.com/docs cũng rất chi tiết.

Kết luận

MongoDB là cơ sở dữ liệu NoSQL dạng document, lưu dữ liệu theo JSON/BSON, với schema linh hoạt và khả năng scale ngang mạnh mẽ. Đây là lựa chọn tuyệt vời khi:

  • Dữ liệu có cấu trúc thay đổi liên tục
  • Bạn làm dự án Node.js / MERN stack
  • Cần prototype nhanh mà không muốn định nghĩa schema từ đầu
  • Xây dựng ứng dụng real-time, IoT, hoặc content management

MongoDB không thay thế SQL — hai loại này có thế mạnh riêng và thường được dùng song song trong cùng một hệ thống lớn. Điều quan trọng là bạn hiểu khi nào nên dùng cái nào.

Bước tiếp theo: Tạo tài khoản MongoDB Atlas miễn phí tại mongodb.com/atlas, thử thực hành các lệnh CRUD cơ bản, và kết hợp với dự án backend của bạn. Xem thêm Lộ trình học Backend 2026 để có kế hoạch học tập toàn diện.

Về tác giả

Ảnh đại diện tác giả Kenji — họa tiết hình học

Kenji

Kỹ sư phần mềm full-stack (Web), hơn 5 năm kinh nghiệm thực tế

  • Python
  • DB
  • Hạ tầng
  • Đào tạo & cố vấn
  • AI

Làm việc cùng đồng nghiệp người Việt, tôi thấy thiếu tài liệu kỹ thuật rõ ràng bằng tiếng Việt. codeahoc là nơi tôi chia sẻ theo hướng thực tế, dễ áp dụng.

Nguyên tắc nội dung

  • Ưu tiên nguồn gốc và góc nhìn từ thực tế triển khai.
  • Nếu có sai sót, nội dung sẽ được cập nhật và sửa kịp thời.

Khóa học liên quan

The Complete SQL Bootcamp: Go from Zero to Hero

SQL từ cơ bản đến nâng cao với PostgreSQL.

4.7
Xem khóa học →

MongoDB - The Complete Developer's Guide

Học MongoDB toàn diện: CRUD, aggregation, indexing.

4.6
Xem khóa học →

*Đây là liên kết liên kết (affiliate link). Chúng tôi có thể nhận hoa hồng nếu bạn mua khóa học qua liên kết này.