MongoDB là một cơ sở dữ liệu NoSQL sử dụng cách tiếp cận linh hoạt dựa trên document để lưu trữ dữ liệu trong các tài liệu giống JSON được tổ chức theo collection. Nói ngắn gọn, khi làm việc với MongoDB, dữ liệu của bạn được lưu theo cách trông rất giống JSON. Điều này giúp dễ đọc, dễ ánh xạ vào mã và có khả năng mở rộng. MongoDB hiện đại và đi theo hướng khác so với cơ sở dữ liệu quan hệ. Cơ sở dữ liệu quan hệ lưu dữ liệu theo hàng trong bảng. Cách tiếp cận này có ưu điểm, nhưng một trong những thách thức lớn là tạo mối quan hệ bằng cách dùng thêm các bảng phụ. MongoDB giải quyết vấn đề này bằng cách đưa ra lược đồ linh hoạt, nơi dữ liệu được lưu trong collection chứ không phải bảng. Điều này có nghĩa là dữ liệu liên quan đến một đối tượng có thể được lưu cùng với chính đối tượng đó. Trong hướng dẫn này, chúng ta sẽ khám phá bảy khái niệm mà người mới bắt đầu nên biết khi sử dụng MongoDB. Vậy thì, hãy bắt đầu.
Hiểu về NoSQL và cơ sở dữ liệu dạng document
Khi nghĩ đến cơ sở dữ liệu, đa số mọi người sẽ nghĩ đến SQL, nơi dữ liệu được lưu theo hàng, bảng và các mối quan hệ. Điều này rất phù hợp với nhiều ứng dụng, đặc biệt khi dữ liệu của ứng dụng có cấu trúc. Nhưng nó có thể trở nên gò bó khi dữ liệu không khớp gọn gàng với cấu trúc bảng.
Đó là lúc NoSQL xuất hiện. NoSQL đơn giản có nghĩa là “không chỉ có SQL.” Nó bao gồm một nhóm cơ sở dữ liệu rời xa mô hình bảng cứng nhắc để mang lại nhiều linh hoạt hơn. Thay vì ép toàn bộ dữ liệu vào các cột được định nghĩa trước, bạn có thể cấu trúc nó theo cách phù hợp với cách ứng dụng của bạn thực sự hoạt động.
MongoDB là một cơ sở dữ liệu dạng document, một trong những loại cơ sở dữ liệu NoSQL phổ biến nhất. Thay vì hàng và bảng, dữ liệu được lưu dưới dạng document trong các collection. Mỗi document trông rất giống JSON, với các cặp khóa-giá trị, mảng, thậm chí là đối tượng lồng nhau. Điều này giúp biểu diễn dữ liệu đời thực cực kỳ dễ dàng. Một ví dụ điển hình là hồ sơ người dùng với địa chỉ và tùy chọn trong một bản ghi duy nhất, không cần tách ra nhiều bảng. Hãy xem hồ sơ người dùng với địa chỉ và tùy chọn trong một bản ghi duy nhất trong MongoDB sẽ như thế nào.
{"_id":"u123","name":"Moses Anu","email":"[email protected]","addresses":[{"type":"home","city":"Abuja"},{"type":"work","city":"Lagos"}],"preferences":{"language":"English","theme":"dark"}}Được hỗ trợ bởi
Kiến trúc cơ bản của MongoDB
Để làm việc hiệu quả với MongoDB, bạn cần hiểu cách tổ chức dữ liệu trong một cơ sở dữ liệu MongoDB. Khác với cơ sở dữ liệu SQL, nơi dữ liệu được cấu trúc theo bảng và hàng, MongoDB sử dụng collection và document.
Database: Hãy xem nó như một vùng chứa cho mọi thứ. Giống như bạn có thể có nhiều cơ sở dữ liệu trong MySQL, MongoDB cũng linh hoạt cho phép nhiều cơ sở dữ liệu cho các dự án hoặc ứng dụng khác nhau.
Collection: Bên trong mỗi cơ sở dữ liệu là các collection. Hãy hình dung collection như một bảng với lược đồ rất linh hoạt. Đó là vì MongoDB không ép buộc lược đồ chặt chẽ. Bạn có thể đưa các document có trường khác nhau vào cùng một collection.
Document: Đây là nơi “phép thuật” thực sự diễn ra. Document là một đối tượng giống JSON (thực tế bên dưới là BSON) chứa dữ liệu của bạn. Document có thể có đối tượng và mảng lồng nhau, khiến việc làm việc trong các ứng dụng hiện đại trở nên tự nhiên hơn rất nhiều. Chúng ta sẽ nói thêm về BSON trong phần tiếp theo.
Để hiểu rõ hơn kiến trúc MongoDB, hãy xem một ví dụ. Giả sử chúng ta xây dựng một ứng dụng thương mại điện tử đơn giản bằng MongoDB. Dữ liệu của chúng ta sẽ theo cấu trúc sau.
Có một database tên là shopDB.
Bên trong là một collection tên products.
Và bên trong collection đó là các document đại diện cho từng sản phẩm với các thông tin như tên, giá và danh mục.
Lược đồ linh hoạt
Để hiểu rõ hơn khái niệm lược đồ linh hoạt, trong ví dụ ở trên, hãy lưu ý rằng một sản phẩm có thể có trường giảm giá, trong khi sản phẩm khác thì không. MongoDB không bắt buộc mọi sản phẩm phải có chính xác cùng một tập trường. Sự linh hoạt này là một lý do lớn khiến các nhà phát triển yêu thích MongoDB, đặc biệt khi xây dựng các ứng dụng phát triển nhanh.
BSON và các kiểu dữ liệu
Nếu bạn từng làm việc với JSON, MongoDB sẽ cảm thấy rất tự nhiên. Trên thực tế, MongoDB không lưu dữ liệu của bạn dưới dạng JSON thuần. MongoDB sử dụng thứ gọi là BSON. BSON là viết tắt của Binary JSON.
BSON là gì và tại sao MongoDB sử dụng nó?
BSON giống như “người anh em” thông minh và hiệu quả hơn của JSON. Nó giữ nguyên cấu trúc khóa-giá trị dễ đọc mà các nhà phát triển yêu thích, nhưng bổ sung thêm vài “siêu năng lực”:
Hỗ trợ nhiều kiểu dữ liệu hơn JSON (như ngày tháng, số thập phân và nhị phân thô).
Được tối ưu cho mã hóa/giải mã nhanh, giúp truy vấn MongoDB chạy nhanh hơn.
Lưu trữ mọi thứ ở dạng nhị phân gọn nhẹ, hiệu quả hơn cho lượng dữ liệu lớn.
Tóm lại, BSON mang đến cho MongoDB sự linh hoạt của JSON cộng hiệu năng và độ chính xác mà cơ sở dữ liệu cần.
Các kiểu dữ liệu BSON phổ biến
MongoDB hỗ trợ nhiều kiểu dữ liệu, nhưng đây là các kiểu thường gặp và ví dụ của chúng:
"address":{"city":"Lagos","country":"Nigeria"}Được hỗ trợ bởi
ObjectId: kiểu ID đặc biệt mà MongoDB dùng cho ID document duy nhất. ObjectId("64f5c9e8a5f76b1d2c3a4567")
Hãy xem ví dụ về một document hồ sơ người dùng ở định dạng BSON được lưu trong MongoDB:
{"_id": ObjectId("64f5c9e8a5f76b1d2c3a4567"),"name":"Moses","age":30,"isActive":true,"skills":["Laravel","MongoDB","Vue"],"address":{"city":"Abuja","country":"Nigeria"},"createdAt": ISODate("2025-08-18T10:00:00Z")
}Được hỗ trợ bởi
Một vài điểm cần lưu ý:
Trường _id sẽ tự động được tạo dưới dạng ObjectId nếu bạn không tự thiết lập.
Ngày tháng được lưu dưới dạng ISODate, không chỉ là chuỗi đơn thuần.
Document address lồng nhau và mảng skills cho thấy sự linh hoạt của MongoDB so với các hàng phẳng trong SQL.
Nguyên tắc thiết kế lược đồ
MongoDB cho phép bạn phát triển mô hình dữ liệu khi ứng dụng lớn dần vì có lược đồ linh hoạt. Tuy nhiên, nếu không có thiết kế lược đồ phù hợp, lược đồ linh hoạt của MongoDB có thể nhanh chóng trở nên lộn xộn. Bạn không nên vứt bỏ cấu trúc chỉ vì MongoDB cung cấp lược đồ linh hoạt. Hãy cùng điểm qua một vài nguyên tắc thiết kế lược đồ khi làm việc với MongoDB.
Lược đồ linh hoạt so với không có lược đồ
MongoDB thường được mô tả là không có lược đồ, nhưng điều đó hơi gây hiểu lầm. Mỗi document đều có một lược đồ—chỉ là nó không bị áp đặt ở cấp độ cơ sở dữ liệu trừ khi bạn chọn thêm quy tắc xác thực.
Ví dụ, hai document trong cùng một collection users về mặt kỹ thuật có thể trông rất khác nhau:
Sự linh hoạt này rất hữu ích trong giai đoạn dựng mẫu nhanh, nhưng trong môi trường sản xuất, bạn thường sẽ muốn có sự nhất quán. Đó là lúc JSON Schema validation phát huy tác dụng. Bạn có thể áp đặt một số quy tắc để tránh dữ liệu lộn xộn, thiếu tin cậy.
Nhúng dữ liệu so với tham chiếu document
Một quyết định quan trọng khác trong thiết kế lược đồ MongoDB là cách mô hình hóa mối quan hệ. Hãy xem một số cách có thể mô hình hóa mối quan hệ trong document MongoDB.
Nhúng (lồng dữ liệu bên trong một document)
MongoDB hỗ trợ nhúng document trong một collection. Cách tiếp cận này tốt nhất khi dữ liệu thường được truy cập cùng nhau. Ví dụ có thể là một bài blog với các bình luận được lưu trực tiếp bên trong. Dưới đây là ví dụ về nhúng dữ liệu.
{"title":"Intro to MongoDB","comments":[{"user":"Alice","text":"Great post!"},{"user":"Bob","text":"Very helpful."}]}Được hỗ trợ bởi
Dữ liệu được lưu theo cách này có hiệu năng tốt hơn và cần ít truy vấn hơn để lấy hoặc xử lý. Nếu không cấu trúc đúng, nó cũng có thể dẫn tới document cồng kềnh.
Tham chiếu (liên kết giữa các document)
Trong các tình huống dữ liệu liên quan có kích thước lớn hoặc được tái sử dụng thường xuyên, nên liên kết dữ liệu giữa các document. Đây được gọi là tham chiếu.
Ví dụ có thể là một bài blog có nhiều bình luận. Trong trường hợp này, chúng ta có thể chỉ lưu ID của bình luận và các bình luận thực tế nằm trong collection riêng. Mã dưới đây minh họa cách tiếp cận này.
// Blog post{"title":"Intro to MongoDB","commentIds":[ObjectId("..."), ObjectId("...")]}Được hỗ trợ bởi
// Separate comment document{"_id": ObjectId("..."),"user":"Alice","text":"Great post!"}Được hỗ trợ bởi
Cấu trúc dữ liệu theo cách này giúp document nhỏ gọn hơn, tránh trùng lặp và giúp mã dễ bảo trì. Tuy nhiên, nó yêu cầu nhiều truy vấn (dù bạn có thể dùng phép nối $lookup trong aggregation).
Tránh các sai lầm thường gặp khi thiết kế lược đồ
Nhúng quá mức: Vì MongoDB có lược đồ linh hoạt, rất dễ “nhồi” mọi thứ vào một document khổng lồ. Điều này không được khuyến nghị và có thể dẫn tới hiệu năng kém. MongoDB áp dụng giới hạn kích thước tối đa 16MB cho mỗi document nhằm đảm bảo nhà phát triển cấu trúc dữ liệu hợp lý.
Bỏ qua index: Đừng bỏ qua index khi làm việc với MongoDB. Nếu truy vấn của bạn không khớp với thiết kế lược đồ, bạn sẽ gặp tra cứu chậm. Luôn thiết kế với các mẫu truy cập trong đầu.
Xem MongoDB như SQL: Việc chia nhỏ dữ liệu thành các document nhỏ là bình thường. Tuy nhiên, hãy hiểu rằng MongoDB có lược đồ linh hoạt và đừng đối xử với nó như cơ sở dữ liệu quan hệ. Nếu bạn sao chép nguyên xi lược đồ quan hệ sang MongoDB (nhiều bảng/collection nhỏ, chuẩn hóa cao), bạn sẽ đánh mất lợi thế của mô hình document.
Hãy dành thời gian lập kế hoạch lược đồ. Một lược đồ cẩn trọng có thể ảnh hưởng lớn đến hiệu năng ứng dụng của bạn.
Xác thực dữ liệu
MongoDB linh hoạt. Điều này có thể dễ dẫn đến dữ liệu thiếu cấu trúc và lộn xộn nếu không cẩn thận. Đây là lúc xác thực dữ liệu phát huy tác dụng.
Hãy coi việc xác thực là đặt ra “luật chơi” cho collection của bạn. Nó đảm bảo mọi document được chèn hoặc cập nhật đều tuân theo một số quy tắc, như bắt buộc có trường email hoặc đảm bảo “age” luôn là số.
Dùng JSON Schema validation trong MongoDB
MongoDB hỗ trợ JSON Schema để xác thực. JSON Schema là cách tiêu chuẩn để mô tả hình dạng document của bạn. Một số quy tắc có thể áp dụng bao gồm:
Các trường bắt buộc.
Kiểu dữ liệu (string, number, date, v.v.).
Khoảng giá trị hoặc mẫu chuỗi.
Xác thực dữ liệu có thể mang lại “điểm cân bằng” khi làm việc với MongoDB: lược đồ linh hoạt của MongoDB cộng các hàng rào bảo vệ để giữ dữ liệu sạch.
Áp đặt quy tắc để giữ dữ liệu sạch
Giả sử chúng ta có một collection users. Chúng ta muốn đảm bảo rằng:
Mỗi người dùng có name (string).
Mỗi người dùng có email (string, phải trông như một địa chỉ email).
Nếu có age, thì phải là số lớn hơn hoặc bằng 18.
Đây là cách chúng ta có thể áp đặt bằng trình xác thực JSON Schema:
db.createCollection("users",{
validator:{
$jsonSchema:{
bsonType:"object",
required:["name","email"],
properties:{
name:{
bsonType:"string",
description:"must be a string and is required"},
email:{
bsonType:"string",
pattern:"^.+@.+\\..+$",
description:"must be a valid email address"},
age:{
bsonType:"int",
minimum:18,
description:"must be an integer greater than or equal to 18"}}}}})
Được hỗ trợ bởi
MongoDB đảm bảo chỉ dữ liệu hợp lệ mới được lưu vào collection.
Các thao tác CRUD
Cốt lõi của việc làm việc với MongoDB là bốn thao tác cơ bản: create, read, update và delete, được biết đến với tên CRUD.
Nếu bạn làm được CRUD, bạn có thể xây dựng hầu như mọi ứng dụng. MongoDB đơn giản hóa điều này với một số phương thức trực quan. Hãy đi qua từng phương thức.
Create
Để thêm một document mới vào collection trong MongoDB, bạn dùng phương thức insertOne(). Ví dụ, chúng ta có thể tạo một document người dùng mới trong collection user bằng đoạn mã dưới đây.
MongoDB sẽ tự động tạo _id duy nhất cho mỗi document được tạo.
Read
Đọc dữ liệu từ collection rất đơn giản. Chúng ta chỉ cần dùng find(). Có thể lấy tất cả document hoặc lọc theo điều kiện. Đoạn mã dưới đây tìm tất cả người dùng từ collection user.
find() luôn trả về một con trỏ (bạn có thể lặp qua). Nếu bạn chỉ muốn một kết quả khớp, có thể dùng indOne().
Update
Sau khi dữ liệu được tạo, sẽ có nhu cầu sửa đổi. Để chỉnh sửa dữ liệu, dùng phương thức ``` updateOne()```. Chúng ta chỉ định bộ lọc và các thay đổi cần áp dụng.
Chỉ với bốn thao tác này, bạn có thể xây dựng mọi thứ từ ứng dụng việc cần làm đến nền tảng thương mại điện tử.
Thực hành bảo mật tốt nhất
Bảo mật không bao giờ nên là suy nghĩ sau cùng khi nói đến cơ sở dữ liệu. Với điều đó, hãy cùng xem các thực hành cốt lõi mà người mới bắt đầu nên biết.
Xác thực và phân quyền
Theo mặc định, một bản cài đặt MongoDB mới có thể không áp dụng xác thực. Điều đó có nghĩa là bất kỳ ai có thể kết nối đều có khả năng truy cập dữ liệu của bạn. Đây có thể là một rủi ro lớn nếu không xử lý. Để đảm bảo MongoDB không bị mở toang, chúng ta có thể triển khai xác thực và phân quyền.
Authentication đảm bảo chỉ người dùng hợp lệ mới có thể kết nối.
Authorization đảm bảo ngay cả người dùng đã xác thực cũng chỉ có thể thực hiện các hành động được phép.
Ví dụ, thay vì đăng nhập với người dùng root/admin ở mọi nơi, bạn nên tạo người dùng chuyên biệt cho các tác vụ cụ thể.
// Create a new user with read-only access
db.createUser({
user:"reportViewer",
pwd:"strongPassword123",
roles:[{ role:"read", db:"salesDB"}]})Được hỗ trợ bởi
Giờ đây, người dùng này chỉ có thể đọc dữ liệu từ salesDB, không thể ghi hoặc xóa.
Kiểm soát truy cập dựa trên vai trò (RBAC)
MongoDB sử dụng vai trò để quản lý những gì người dùng có thể làm. Một số vai trò dựng sẵn gồm:
Read: Người dùng có quyền này chỉ có thể xem dữ liệu.
ReadWrite: Người dùng có quyền này có thể xem và sửa đổi dữ liệu.
DbAdmin: Người dùng có quyền này có thể quản lý index, thống kê và profiling.
Root: Người dùng có quyền này có toàn quyền. Tránh dùng cho công việc hàng ngày!
Tuân thủ nguyên tắc đặc quyền tối thiểu giúp người dùng có đúng quyền cần thiết để làm việc, đồng thời đảm bảo an toàn cho cơ sở dữ liệu MongoDB.
Tránh phơi bày công khai
Một lỗi thường gặp của người mới là để MongoDB lắng nghe trên cổng mặc định (27017) và bind tới 0.0.0.0 (tất cả giao diện mạng).
Điều đó có nghĩa là cơ sở dữ liệu của bạn mở ra toàn bộ internet. Để ngăn chặn, bạn nên thực hiện các biện pháp sau:
Chỉ bind MongoDB tới localhost hoặc IP riêng/nội bộ.
Dùng tường lửa (hoặc security group trên đám mây) để hạn chế truy cập.
Luôn kết nối qua VPN hoặc SSH tunnel nếu cần truy cập từ xa.
# Example: /etc/mongod.conf
net:
port:27017
bindIp:127.0.0.1 # Only accessible locallyĐược hỗ trợ bởi
Với các thực hành này, triển khai MongoDB của bạn sẽ an toàn hơn nhiều trước rò rỉ vô tình hoặc tấn công ác ý.
Kết luận
MongoDB đã khẳng định vị thế là một trong những cơ sở dữ liệu hàng đầu cho các ứng dụng hiện đại nhờ tính linh hoạt và sức mạnh. Dù bạn đang mày mò với một dự án phụ hay quản lý một hệ thống quy mô lớn, nắm vững các nền tảng sẽ giúp bạn tiết kiệm rất nhiều thời gian và làm việc hiệu quả hơn. Trong bài viết này, chúng ta đã khám phá bảy khái niệm then chốt mà người mới bắt đầu nên biết khi làm việc với MongoDB. Bao gồm
Hiểu về NoSQL và cơ sở dữ liệu dạng document.
Kiến trúc cơ bản của MongoDB.
BSON và các kiểu dữ liệu.
Nguyên tắc thiết kế lược đồ.
Xác thực dữ liệu.
Các thao tác CRUD.
Thực hành bảo mật tốt nhất.
Hiểu rõ các khái niệm trên sẽ giúp bạn có nền tảng vững chắc khi làm việc với MongoDB. Để biết thêm chi tiết, hãy xem MongoDB Docs và khóa học Giới thiệu MongoDB trong Python của DataCamp.
Câu hỏi thường gặp
Sự khác nhau giữa cơ sở dữ liệu NoSQL và SQL là gì?⌄
Cơ sở dữ liệu NoSQL như MongoDB lưu dữ liệu theo định dạng linh hoạt, định hướng document, trong khi cơ sở dữ liệu SQL dùng bảng có cấu trúc với lược đồ cố định.
Kiến trúc của MongoDB hoạt động như thế nào?⌄
MongoDB sử dụng kiến trúc phân tán, có khả năng mở rộng với các thành phần như replica set cho tính sẵn sàng cao và sharding để mở rộng ngang.
BSON là gì và tại sao MongoDB sử dụng nó?⌄
BSON (Binary JSON) là định dạng dữ liệu của MongoDB, được thiết kế để lưu trữ hiệu quả các document giống JSON đồng thời hỗ trợ thêm nhiều kiểu dữ liệu.
Tại sao thiết kế lược đồ lại quan trọng trong MongoDB?⌄
Mặc dù MongoDB không ép buộc lược đồ, việc thiết kế lược đồ cẩn thận giúp truy vấn hiệu quả, giảm dư thừa và cải thiện hiệu năng ứng dụng.
Làm thế nào để tôi bảo mật cơ sở dữ liệu MongoDB khi mới bắt đầu?⌄
Bạn có thể bật xác thực, dùng kiểm soát truy cập dựa trên vai trò, bắt buộc kết nối TLS/SSL, và thường xuyên cập nhật MongoDB để bảo vệ trước các lỗ hổng.
MongoDB là một cơ sở dữ liệu NoSQL sử dụng cách tiếp cận linh hoạt dựa trên document để lưu trữ dữ liệu trong các tài liệu giống JSON được tổ chức theo collection. Nói ngắn gọn, khi làm việc với MongoDB, dữ liệu của bạn được lưu theo cách trông rất giống JSON. Điều này giúp dễ đọc, dễ ánh xạ vào mã và có khả năng mở rộng. MongoDB hiện đại và đi theo hướng khác so với cơ sở dữ liệu quan hệ. Cơ sở dữ liệu quan hệ lưu dữ liệu theo hàng trong bảng. Cách tiếp cận này có ưu điểm, nhưng một trong những thách thức lớn là tạo mối quan hệ bằng cách dùng thêm các bảng phụ. MongoDB giải quyết vấn đề này bằng cách đưa ra lược đồ linh hoạt, nơi dữ liệu được lưu trong collection chứ không phải bảng. Điều này có nghĩa là dữ liệu liên quan đến một đối tượng có thể được lưu cùng với chính đối tượng đó. Trong hướng dẫn này, chúng ta sẽ khám phá bảy khái niệm mà người mới bắt đầu nên biết khi sử dụng MongoDB. Vậy thì, hãy bắt đầu.
Hiểu về NoSQL và cơ sở dữ liệu dạng document
Khi nghĩ đến cơ sở dữ liệu, đa số mọi người sẽ nghĩ đến SQL, nơi dữ liệu được lưu theo hàng, bảng và các mối quan hệ. Điều này rất phù hợp với nhiều ứng dụng, đặc biệt khi dữ liệu của ứng dụng có cấu trúc. Nhưng nó có thể trở nên gò bó khi dữ liệu không khớp gọn gàng với cấu trúc bảng.
Đó là lúc NoSQL xuất hiện. NoSQL đơn giản có nghĩa là “không chỉ có SQL.” Nó bao gồm một nhóm cơ sở dữ liệu rời xa mô hình bảng cứng nhắc để mang lại nhiều linh hoạt hơn. Thay vì ép toàn bộ dữ liệu vào các cột được định nghĩa trước, bạn có thể cấu trúc nó theo cách phù hợp với cách ứng dụng của bạn thực sự hoạt động.
MongoDB là một cơ sở dữ liệu dạng document, một trong những loại cơ sở dữ liệu NoSQL phổ biến nhất. Thay vì hàng và bảng, dữ liệu được lưu dưới dạng document trong các collection. Mỗi document trông rất giống JSON, với các cặp khóa-giá trị, mảng, thậm chí là đối tượng lồng nhau. Điều này giúp biểu diễn dữ liệu đời thực cực kỳ dễ dàng. Một ví dụ điển hình là hồ sơ người dùng với địa chỉ và tùy chọn trong một bản ghi duy nhất, không cần tách ra nhiều bảng. Hãy xem hồ sơ người dùng với địa chỉ và tùy chọn trong một bản ghi duy nhất trong MongoDB sẽ như thế nào.
Kiến trúc cơ bản của MongoDB
Để làm việc hiệu quả với MongoDB, bạn cần hiểu cách tổ chức dữ liệu trong một cơ sở dữ liệu MongoDB. Khác với cơ sở dữ liệu SQL, nơi dữ liệu được cấu trúc theo bảng và hàng, MongoDB sử dụng collection và document.
Để hiểu rõ hơn kiến trúc MongoDB, hãy xem một ví dụ. Giả sử chúng ta xây dựng một ứng dụng thương mại điện tử đơn giản bằng MongoDB. Dữ liệu của chúng ta sẽ theo cấu trúc sau.
Lược đồ linh hoạt
Để hiểu rõ hơn khái niệm lược đồ linh hoạt, trong ví dụ ở trên, hãy lưu ý rằng một sản phẩm có thể có trường giảm giá, trong khi sản phẩm khác thì không. MongoDB không bắt buộc mọi sản phẩm phải có chính xác cùng một tập trường. Sự linh hoạt này là một lý do lớn khiến các nhà phát triển yêu thích MongoDB, đặc biệt khi xây dựng các ứng dụng phát triển nhanh.
BSON và các kiểu dữ liệu
Nếu bạn từng làm việc với JSON, MongoDB sẽ cảm thấy rất tự nhiên. Trên thực tế, MongoDB không lưu dữ liệu của bạn dưới dạng JSON thuần. MongoDB sử dụng thứ gọi là BSON. BSON là viết tắt của Binary JSON.
BSON là gì và tại sao MongoDB sử dụng nó?
BSON giống như “người anh em” thông minh và hiệu quả hơn của JSON. Nó giữ nguyên cấu trúc khóa-giá trị dễ đọc mà các nhà phát triển yêu thích, nhưng bổ sung thêm vài “siêu năng lực”:
Tóm lại, BSON mang đến cho MongoDB sự linh hoạt của JSON cộng hiệu năng và độ chính xác mà cơ sở dữ liệu cần.
Các kiểu dữ liệu BSON phổ biến
MongoDB hỗ trợ nhiều kiểu dữ liệu, nhưng đây là các kiểu thường gặp và ví dụ của chúng:
"name": "Alice""age": 28"isActive": true"createdAt": ISODate("2025-08-18T10:00:00Z")"skills": ["MongoDB", "Node.js", "React"]ObjectId("64f5c9e8a5f76b1d2c3a4567")Hãy xem ví dụ về một document hồ sơ người dùng ở định dạng BSON được lưu trong MongoDB:
Một vài điểm cần lưu ý:
_idsẽ tự động được tạo dưới dạngObjectIdnếu bạn không tự thiết lập.ISODate, không chỉ là chuỗi đơn thuần.addresslồng nhau và mảngskillscho thấy sự linh hoạt của MongoDB so với các hàng phẳng trong SQL.Nguyên tắc thiết kế lược đồ
MongoDB cho phép bạn phát triển mô hình dữ liệu khi ứng dụng lớn dần vì có lược đồ linh hoạt. Tuy nhiên, nếu không có thiết kế lược đồ phù hợp, lược đồ linh hoạt của MongoDB có thể nhanh chóng trở nên lộn xộn. Bạn không nên vứt bỏ cấu trúc chỉ vì MongoDB cung cấp lược đồ linh hoạt. Hãy cùng điểm qua một vài nguyên tắc thiết kế lược đồ khi làm việc với MongoDB.
Lược đồ linh hoạt so với không có lược đồ
MongoDB thường được mô tả là không có lược đồ, nhưng điều đó hơi gây hiểu lầm. Mỗi document đều có một lược đồ—chỉ là nó không bị áp đặt ở cấp độ cơ sở dữ liệu trừ khi bạn chọn thêm quy tắc xác thực.
Ví dụ, hai document trong cùng một collection
usersvề mặt kỹ thuật có thể trông rất khác nhau:Sự linh hoạt này rất hữu ích trong giai đoạn dựng mẫu nhanh, nhưng trong môi trường sản xuất, bạn thường sẽ muốn có sự nhất quán. Đó là lúc JSON Schema validation phát huy tác dụng. Bạn có thể áp đặt một số quy tắc để tránh dữ liệu lộn xộn, thiếu tin cậy.
Nhúng dữ liệu so với tham chiếu document
Một quyết định quan trọng khác trong thiết kế lược đồ MongoDB là cách mô hình hóa mối quan hệ. Hãy xem một số cách có thể mô hình hóa mối quan hệ trong document MongoDB.
Nhúng (lồng dữ liệu bên trong một document)
MongoDB hỗ trợ nhúng document trong một collection. Cách tiếp cận này tốt nhất khi dữ liệu thường được truy cập cùng nhau. Ví dụ có thể là một bài blog với các bình luận được lưu trực tiếp bên trong. Dưới đây là ví dụ về nhúng dữ liệu.
Dữ liệu được lưu theo cách này có hiệu năng tốt hơn và cần ít truy vấn hơn để lấy hoặc xử lý. Nếu không cấu trúc đúng, nó cũng có thể dẫn tới document cồng kềnh.
Tham chiếu (liên kết giữa các document)
Trong các tình huống dữ liệu liên quan có kích thước lớn hoặc được tái sử dụng thường xuyên, nên liên kết dữ liệu giữa các document. Đây được gọi là tham chiếu.
Ví dụ có thể là một bài blog có nhiều bình luận. Trong trường hợp này, chúng ta có thể chỉ lưu ID của bình luận và các bình luận thực tế nằm trong collection riêng. Mã dưới đây minh họa cách tiếp cận này.
Cấu trúc dữ liệu theo cách này giúp document nhỏ gọn hơn, tránh trùng lặp và giúp mã dễ bảo trì. Tuy nhiên, nó yêu cầu nhiều truy vấn (dù bạn có thể dùng phép nối $lookup trong aggregation).
Tránh các sai lầm thường gặp khi thiết kế lược đồ
Nhúng quá mức: Vì MongoDB có lược đồ linh hoạt, rất dễ “nhồi” mọi thứ vào một document khổng lồ. Điều này không được khuyến nghị và có thể dẫn tới hiệu năng kém. MongoDB áp dụng giới hạn kích thước tối đa 16MB cho mỗi document nhằm đảm bảo nhà phát triển cấu trúc dữ liệu hợp lý.
Bỏ qua index: Đừng bỏ qua index khi làm việc với MongoDB. Nếu truy vấn của bạn không khớp với thiết kế lược đồ, bạn sẽ gặp tra cứu chậm. Luôn thiết kế với các mẫu truy cập trong đầu.
Xem MongoDB như SQL: Việc chia nhỏ dữ liệu thành các document nhỏ là bình thường. Tuy nhiên, hãy hiểu rằng MongoDB có lược đồ linh hoạt và đừng đối xử với nó như cơ sở dữ liệu quan hệ. Nếu bạn sao chép nguyên xi lược đồ quan hệ sang MongoDB (nhiều bảng/collection nhỏ, chuẩn hóa cao), bạn sẽ đánh mất lợi thế của mô hình document.
Hãy dành thời gian lập kế hoạch lược đồ. Một lược đồ cẩn trọng có thể ảnh hưởng lớn đến hiệu năng ứng dụng của bạn.
Xác thực dữ liệu
MongoDB linh hoạt. Điều này có thể dễ dẫn đến dữ liệu thiếu cấu trúc và lộn xộn nếu không cẩn thận. Đây là lúc xác thực dữ liệu phát huy tác dụng.
Hãy coi việc xác thực là đặt ra “luật chơi” cho collection của bạn. Nó đảm bảo mọi document được chèn hoặc cập nhật đều tuân theo một số quy tắc, như bắt buộc có trường email hoặc đảm bảo “age” luôn là số.
Dùng JSON Schema validation trong MongoDB
MongoDB hỗ trợ JSON Schema để xác thực. JSON Schema là cách tiêu chuẩn để mô tả hình dạng document của bạn. Một số quy tắc có thể áp dụng bao gồm:
Xác thực dữ liệu có thể mang lại “điểm cân bằng” khi làm việc với MongoDB: lược đồ linh hoạt của MongoDB cộng các hàng rào bảo vệ để giữ dữ liệu sạch.
Áp đặt quy tắc để giữ dữ liệu sạch
Giả sử chúng ta có một collection users. Chúng ta muốn đảm bảo rằng:
Đây là cách chúng ta có thể áp đặt bằng trình xác thực JSON Schema:
MongoDB đảm bảo chỉ dữ liệu hợp lệ mới được lưu vào collection.
Các thao tác CRUD
Cốt lõi của việc làm việc với MongoDB là bốn thao tác cơ bản: create, read, update và delete, được biết đến với tên CRUD.
Nếu bạn làm được CRUD, bạn có thể xây dựng hầu như mọi ứng dụng. MongoDB đơn giản hóa điều này với một số phương thức trực quan. Hãy đi qua từng phương thức.
Create
Để thêm một document mới vào collection trong MongoDB, bạn dùng phương thức
insertOne(). Ví dụ, chúng ta có thể tạo một document người dùng mới trong collectionuserbằng đoạn mã dưới đây.MongoDB sẽ tự động tạo
_idduy nhất cho mỗi document được tạo.Read
Đọc dữ liệu từ collection rất đơn giản. Chúng ta chỉ cần dùng
find(). Có thể lấy tất cả document hoặc lọc theo điều kiện. Đoạn mã dưới đây tìm tất cả người dùng từ collection user.Chúng ta có thể lọc bằng khóa duy nhất—ví dụ email.
find()luôn trả về một con trỏ (bạn có thể lặp qua). Nếu bạn chỉ muốn một kết quả khớp, có thể dùngindOne().Update
Sau khi dữ liệu được tạo, sẽ có nhu cầu sửa đổi. Để chỉnh sửa dữ liệu, dùng phương thức ``` updateOne()```. Chúng ta chỉ định bộ lọc và các thay đổi cần áp dụng.
Toán tử
$setchỉ cập nhật trường được chỉ định, giữ nguyên phần còn lại của document.Delete
Cuối cùng, chúng ta có thể xóa document với
deleteOne()hoặcdeleteMany(). Ví dụ dưới đây minh họa hành độngdeleteOne.Lưu ý rằng thao tác xóa là vĩnh viễn.
Chỉ với bốn thao tác này, bạn có thể xây dựng mọi thứ từ ứng dụng việc cần làm đến nền tảng thương mại điện tử.
Thực hành bảo mật tốt nhất
Bảo mật không bao giờ nên là suy nghĩ sau cùng khi nói đến cơ sở dữ liệu. Với điều đó, hãy cùng xem các thực hành cốt lõi mà người mới bắt đầu nên biết.
Xác thực và phân quyền
Theo mặc định, một bản cài đặt MongoDB mới có thể không áp dụng xác thực. Điều đó có nghĩa là bất kỳ ai có thể kết nối đều có khả năng truy cập dữ liệu của bạn. Đây có thể là một rủi ro lớn nếu không xử lý. Để đảm bảo MongoDB không bị mở toang, chúng ta có thể triển khai xác thực và phân quyền.
Ví dụ, thay vì đăng nhập với người dùng root/admin ở mọi nơi, bạn nên tạo người dùng chuyên biệt cho các tác vụ cụ thể.
Giờ đây, người dùng này chỉ có thể đọc dữ liệu từ
salesDB, không thể ghi hoặc xóa.Kiểm soát truy cập dựa trên vai trò (RBAC)
MongoDB sử dụng vai trò để quản lý những gì người dùng có thể làm. Một số vai trò dựng sẵn gồm:
Tuân thủ nguyên tắc đặc quyền tối thiểu giúp người dùng có đúng quyền cần thiết để làm việc, đồng thời đảm bảo an toàn cho cơ sở dữ liệu MongoDB.
Tránh phơi bày công khai
Một lỗi thường gặp của người mới là để MongoDB lắng nghe trên cổng mặc định (27017) và bind tới 0.0.0.0 (tất cả giao diện mạng).
Điều đó có nghĩa là cơ sở dữ liệu của bạn mở ra toàn bộ internet. Để ngăn chặn, bạn nên thực hiện các biện pháp sau:
localhosthoặc IP riêng/nội bộ.Với các thực hành này, triển khai MongoDB của bạn sẽ an toàn hơn nhiều trước rò rỉ vô tình hoặc tấn công ác ý.
Kết luận
MongoDB đã khẳng định vị thế là một trong những cơ sở dữ liệu hàng đầu cho các ứng dụng hiện đại nhờ tính linh hoạt và sức mạnh. Dù bạn đang mày mò với một dự án phụ hay quản lý một hệ thống quy mô lớn, nắm vững các nền tảng sẽ giúp bạn tiết kiệm rất nhiều thời gian và làm việc hiệu quả hơn. Trong bài viết này, chúng ta đã khám phá bảy khái niệm then chốt mà người mới bắt đầu nên biết khi làm việc với MongoDB. Bao gồm
Hiểu rõ các khái niệm trên sẽ giúp bạn có nền tảng vững chắc khi làm việc với MongoDB. Để biết thêm chi tiết, hãy xem MongoDB Docs và khóa học Giới thiệu MongoDB trong Python của DataCamp.