Tìm hiểu tổng quan về MongoDB

Tổng quan về MongoDB

Posted by Box XV on August 5, 2022. 13 min read.

MongoDB

MongoDB là một chương trình cơ sở dữ liệu mã nguồn mở được thiết kế theo kiểu hướng đối tượng trong đó các bảng được cấu trúc một cách linh hoạt cho phép các dữ liệu lưu trên bảng không cần phải tuân theo một dạng cấu trúc nhất định nào. Chính do cấu trúc linh hoạt này nên MongoDB có thể được dùng để lưu trữ các dữ liệu có cấu trúc phức tạp và đa dạng và không cố định (hay còn gọi là Big Data).

Mongo viết bằng C++. Nó thích hợp cho các ứng dụng tầm trung trở lên. Nếu tỉ lệ lượng dữ liệu ghi vào CSDL của ứng dụng lớn hơn lượng đọc thì đây càng là lựa chọn hợp lý.

1. Định nghĩa về MongoDB

  • MongoDB là một cơ sở dữ liệu mã nguồn mở và là cơ sở dữ liệu NoSQL(*) hàng đầu, được hàng triệu người sử dụng. MongoDB được viết bằng C++.
  • Ngoài ra, MongoDB là một cơ sở dữ liệu đa nền tảng, hoạt động trên các khái niệm Collection và Document, nó cung cấp hiệu suất cao, tính khả dụng cao và khả năng mở rộng dễ dàng.
  • NoSQL là 1 dạng CSDL mã nguồn mở không sử dụng Transact-SQL để truy vấn thông tin. NoSQL viết tắt bởi: None-Relational SQL, hay có nơi thường gọi là Not-Only SQL. CSDL này được phát triển trên Javascript Framework với kiểu dữ liệu JSON. (Cú pháp của JSON là “key:value”) NoSQL ra đời như là 1 mảnh vá cho những khuyết điểm và thiếu xót cũng như hạn chế của mô hình dữ liệu quan hệ RDBMS về tốc độ, tính năng, khả năng mở rộng, memory cache,…

2. MongoDB hoạt động như thế nào

  • MongoDB hoạt động dưới một tiến trình ngầm service, luôn mở một cổng (Cổng mặc định là 27017) để lắng nghe các yêu cầu truy vấn, thao tác từ các ứng dụng gửi vào sau đó mới tiến hành xử lý.
  • Mỗi một bản ghi của MongoDB được tự động gắn thêm một field có tên “_id” thuộc kiểu dữ liệu ObjectId mà nó quy định để xác định được tính duy nhất của bản ghi này so với bản ghi khác, cũng như phục vụ các thao tác tìm kiếm và truy vấn thông tin về sau. Trường dữ liệu “_id” luôn được tự động đánh index (chỉ mục) để tốc độ truy vấn thông tin đạt hiệu suất cao nhất.
  • Mỗi khi có một truy vấn dữ liệu, bản ghi được cache (ghi đệm) lên bộ nhớ Ram, để phục vụ lượt truy vấn sau diễn ra nhanh hơn mà không cần phải đọc từ ổ cứng.
  • Khi có yêu cầu thêm/sửa/xóa bản ghi, để đảm bảo hiệu suất của ứng dụng mặc định MongoDB sẽ chưa cập nhật xuống ổ cứng ngay, mà sau 60 giây MongoDB mới thực hiện ghi toàn bộ dữ liệu thay đổi từ RAM xuống ổ cứng.

Từ đây có thể nhìn thấy nhược điểm của Mongodb như sau:

  • Dữ liệu được caching, lấy RAM làm trọng tâm hoạt động vì vậy khi hoạt động yêu cầu một bộ nhớ RAM lớn
  • Như đã giới thiệu ở trên, mọi thay đổi về dữ liệu mặc định đều chưa được ghi xuống ổ cứng ngay lập tức vì vậy khả năng bị mất dữ liệu từ nguyên nhân mất điện đột xuất là rất cao.

3. Lợi thế của MongoDB

  • Ít schema hơn: Vì schema được sinh ra là để nhóm các đối tượng vào 1 cụm, dễ quản lý. Ví dụ như tạo 1 schema tên là Students chẳng hạn thì chỉ có những gì liên quan đến student thì mới được cho vào schema này. Trong khi đó trong mongodb thì chỉ 1 collection ta có thể chứa nhiều document khác nhau. Với mỗi document thì số trường, nội dung, kích thước lại có thể khác nhau.
  • Cấu trúc của một đối tượng rõ ràng.
  • Không có các Join phức tạp.
  • Khả năng mở rộng cực lớn: việc mở rộng dữ liệu mà không phải lo đến các vấn đề như khóa ngoại, khóa chính, kiểm tra ràng buộc, … MongoDB cho phép thực hiện replication và sharding nên việc mở rộng cũng thuận lợi hơn.
  • Sử dụng bộ nhớ trong để lưu giữ cửa sổ làm việc cho phép truy cập dữ liệu nhanh hơn. Việc cập nhật được thực hiện nhanh gọn nhờ update tại chỗ (in-place).

4. Khi nào NÊN sử dụng MongoDB ?

Sử dụng MongoDB trong trường hợp:

  • Nếu website của bạn có tính chất INSERT cao Bởi vì mặc định MongoDB có sẵn cơ chế ghi với tốc độ cao và an toàn.Website của bạn ở dạng thời gian thực nhiều, nghĩa là nhiều người thao tác với ứng dung. Nếu trong quá trình load bị lỗi tại một điểm nào đó thì nó sẽ bỏ qua phần đó nên sẽ an toàn.
  • Website bạn có nhiều dữ liệu quá Giả sử web bạn có đến 10 triệu records thì đó là cơn ác mộng với MYSQL. Bởi vì MongoDB có khả năng tìm kiến thông tin liên quan cũng khá nhanh nên trường hợp này nên dùng nó.
  • Máy chủ không có hệ quản trị CSDL Trường hợp này thường bạn sẽ sử dụng SQLITE hoặc là MongoDB.

5. Khi nào KHÔNG NÊN sử dụng MongoDB ?

  • Các ứng dụng cần sử dụng nhiều transaction (như ngân hàng) do Mongodb không có cơ chế transaction (giao dịch) để phục vụ cho các ứng dụng ngân hàng
  • Các ứng dụng cần SQL (sử dụng joins).

6. Các công cụ quản trị MongoDB

Một số công cụ điển hình như:

7. Cài đặt MongoDB

- Trên Windows:

  • Tải MongoDB từ link bên dưới: https://www.mongodb.com/try/download
  • Chạy file vừa tải về
  • Sau khi chạy xong file, vào thư mục C:\Program Files\MongoDB\Server\6.0\bin, chạy file mongod để khởi động mongoDB
  • Dùng địa chỉ 127.0.0.1:27017 để tạo connection đến mongoDB

- Trên Linux:

  • Tham khảo trên website : install
  • hoặc tham khảo video cài đặt tại: link

8. Các thuật ngữ hay sử dụng trong MongoDB

Nhiều khái niệm trong MySQL có các khái niệm tương tự gần nhau trong MongoDB. Bảng dưới đây phác thảo các khái niệm chung trên MySQL và MongoDB.

MySQL MongoDB
ACID Transactions ACID Transactions*
Table Collection
Tuple/Row Document
Column Field
Secondary Index Secondary Index
JOINs Embedded documents, $lookup & $graphLookup
GROUP_BY Aggregation Pipeline
Primary Key Primary Key (Default key _id provided by mongodb itself)
  • _id – Là trường bắt buộc có trong mỗi document. Trường _id đại diện cho một giá trị duy nhất trong document MongoDB. Trường _id cũng có thể được hiểu là khóa chính trong document. Nếu bạn thêm mới một document thì MongoDB sẽ tự động sinh ra một _id đại diện cho document đó và là duy nhất trong cơ sở dữ liệu MongoDB.
  • Collection – Là nhóm của nhiều document trong MongoDB. Collection có thể được hiểu là một bảng tương ứng trong cơ sở dữ liệu RDBMS (Relational Database Management System). Collection nằm trong một cơ sở dữ liệu duy nhất. Các collection không phải định nghĩa các cột, các hàng hay kiểu dữ liệu trước.
  • Cursor – Đây là một con trỏ đến tập kết quả của một truy vấn. Máy khách có thể lặp qua một con trỏ để lấy kết quả.
  • Database – Nơi chứa các Collection, giống với cơ sở dữ liệu RDMS chúng chứa các bảng. Mỗi Database có một tập tin riêng lưu trữ trên bộ nhớ vật lý. Một mấy chủ MongoDB có thể chứa nhiều Database.
  • Document – Một bản ghi thuộc một Collection thì được gọi là một Document. Các Document lần lượt bao gồm các trường tên và giá trị.
  • Field – Là một cặp name – value trong một document. Một document có thể có không hoặc nhiều trường. Các trường giống các cột ở cơ sở dữ liệu quan hệ.
  • JSON – Viết tắt của JavaScript Object Notation. Con người có thể đọc được ở định dạng văn bản đơn giản thể hiện cho các dữ liệu có cấu trúc. Hiện tại JSON đang hỗ trợ rất nhiều ngôn ngữ lập trình.
  • Index – Là những cấu trúc dữ liệu đặc biệt, dùng để chứa một phần nhỏ của các tập dữ liệu một cách dễ dàng để quét. Chỉ số lưu trữ giá trị của một fields cụ thể hoặc thiết lập các fields, sắp xếp theo giá trị của các fields này. Index hỗ trợ độ phân tích một cách hiệu quả các truy vấn. Nếu không có chỉ mục, MongoDB sẽ phải quét tất cả các documents của collection để chọn ra những document phù hợp với câu truy vấn. Quá trình quét này là không hiệu quả và yêu cầu MongoDB để xử lý một khối lượng lớn dữ liệu.

Hãy lưu ý sự khác biệt của các trường và _id trong một document. Một _id được dùng để đại diện cho một document và chúng được sinh ra khi thêm một Document vào Collection.

Document Là một khái niệm cơ bản nhất trong MongoDB, nó tương đương với một hàng trong các hệ quản trị cơ sở dữ liệu quan hệ khác vậy nhưng khả năng lưu trữ đa dạng hơn nhiều. Document có cấu trúc theo dạng nhiều bộ các key-value giống như dạng json, ví dụ:

Collection là một nhóm các document, nếu document tương tự một hàng trong các cơ sở dữ liệu quan hệ thì collection sẽ tương đương với một bảng. Điều đặc biệt hơn là collection có thể lưu trữ rất linh hoạt.

Database là một nhóm các collection. Một máy chủ MongoDB có thể chứa 0 hoặc nhiều database. Khi vừa cài đặt ta sẽ có 3 database mặc định là admin, local, test.

  • Admin là database gốc của MongoDB, chứa các thông tin để xác thực, bảo mật. Nếu một user được thêm vào admin database, user này sẽ có tất cẩ các quyền trên tất các database.
  • Local: Database này chỉ được sử dụng trong replication system. Nó sẽ lưu thữ thông tin của từng máy chủ thành viên trong Replica Set.
  • Test: Database này giống như các database bình thường khác. Bạn có thể dùng nó để luyện tập.

9. Một số cân nhắc khi thiết kế schema trong MongoDB

  • Thiết kế schema dựa trên yêu cầu của user
  • Kết hợp các object vào một document nếu bạn sử dụng chúng với nhau. Nếu không thì tách riêng hẳn nó ra (nhưng cần phải chú ý là sau này nó sẽ không phải joins).
  • Duplicate dữ liệu (nhưng có giới hạn) vì không gian đĩa là quá rẻ so với tốc độ xử lý.
  • joins khi write, không joins khi read.
  • Tối ưu schema cho hầu hết các case sử dụng thông thường
  • Tập hợp các nhóm phức tạp vào schema

Ví dụ : Giả sử là một khách hàng cần một thiết kế DB cho blog của anh ta và cân nhắc sự khác biệt schema giữa RDMS và MongoDB. Web sẽ có những yêu cầu sau :

  • Mọi post có unique title, description và url.
  • Mọi post có thể có 1 hoặc nhiều tags.
  • Mọi post có name của publisher và số lượng người xem likes
  • Mọi post có comments bới một user với name, message, data-time và likes.
  • Mỗi postc có thể có 0 hoặc nhiều comments.

Trong thiết kế schema của RDBMS chúng ta sẽ có như sau về post và comments và tags.

Trong khi đó ở MongoDB schema, chúng ta sẽ có thiết kế một collection post và có cấu trúc như sau :

{
   _id: POST_ID
   title: TITLE_OF_POST,
   description: POST_DESCRIPTION,
   by: POST_BY,
   url: URL_OF_POST,
   tags: [TAG1, TAG2, TAG3],
   likes: TOTAL_LIKES,
   comments: [
      {
         user:'COMMENT_BY',
         message: TEXT,
         dateCreated: DATE_TIME,
         like: LIKES
      },
      {
         user:'COMMENT_BY',
         message: TEXT,
         dateCreated: DATE_TIME,
         like: LIKES
      }
   ]
}

10. Các kiểu dữ liệu trong MongoDB

  • Chuỗi: Đây là kiểu dữ liệu được sử dụng phổ biến nhất để lưu giữ dữ liệu. Chuỗi trong MongoDB phải là UTF-8 hợp lệ.
  • Số nguyên: Kiểu dữ liệu này được sử dụng để lưu một giá trị số. Số nguyên có thể là 32 bit hoặc 64 bit phụ thuộc vào Server của bạn.
  • Boolean: Kiểu dữ liệu này được sử dụng để lưu giữ một giá trị Boolean (true/false).
  • Double: Kiểu dữ liệu này được sử dụng để lưu các giá trị số thực dấu chấm động.
  • Min/ Max keys: Kiểu dữ liệu này được sử dụng để so sánh một giá trị với các phần tử BSON thấp nhất và cao nhất.
  • Mảng: Kiểu dữ liệu này được sử dụng để lưu giữ các mảng hoặc danh sách hoặc nhiều giá trị vào trong một key.
  • Timestamp: Đánh dấu thời điểm một Document được sửa đổi hoặc được thêm vào.
  • Object: Kiểu dữ liệu này được sử dụng cho các Document được nhúng vào.
  • Null: Kiểu dữ liệu này được sử dụng để lưu một giá trị Null.
  • Symbol: Kiểu dữ liệu này được sử dụng giống như một chuỗi
  • **Date **: Kiểu dữ liệu này được sử dụng để lưu giữ date và time hiện tại trong định dạng UNIX time.
  • Object ID: Kiểu dữ liệu này được sử dụng để lưu giữ ID của Document.
  • Binary data: Kiểu dữ liệu này được sử dụng để lưu giữ dữ liệu nhị phân.
  • Code: Kiểu dữ liệu này được sử dụng để lưu giữ JavaScrip code vào trong Document.
  • Regular expression: Kiểu dữ liệu này được sử dụng để lưu giữ Regular Expresion.

Sự tương quan các thuật ngữ được sử dụng trong MongoDB và SQL

Operation In SQL In MongoDB
Create Insert Insert
Read Select Find
Update Update Update
Delete Delete Remove
Table Table Collection
Row Row Document

Lưu ý khi sử dụng Mongodb:

  • MongoDB sinh ra để tăng tốc độ truy xuất dữ liệu, phù hợp cho các ứng dụng cần tốc độ phản hồi nhanh(realtime như facebook chẳng hạn). Còn các tác nghiệp cần tính toàn vẹn dữ liệu(trong banking) thì Nosql sẽ ko bao giờ là 1 giải pháp cả mà người ta sẽ dùng Mysql.
  • MongoDB không có tính ràng buộc, một điều tồi tệ trong Database vì vậy sẽ rất cần sự cẩn thận khi thao tác trên các collection có quan hệ dữ liệu với nhau.
  • MongoDB đẩy trách nghiệm thao tác Database cho tầng ứng dụng nên sẽ tốn tài nguyên(tài nguyên bây giờ không còn là vấn đề quá lớn nữa).
  • MongoDb có thể mở trộng theo chiều ngang (scale out) phương pháp tăng cường khả năng lưu trữ và xử lý là dùng nhiều máy tính phân tán. MongoDb còn có thể mở rộng theo chiều dọc (scale up) tăng cấu hình server.
  • MongoDb có thể dùng nhiều máy tính phân tán để lưu trữ dữ liệu nên chi phí sẽ rẻ hơn Mysql. Mysql sử dụng những máy chủ hàng khủng, độc quyền nên sẽ đắt đỏ hơn.

Một số câu lệnh dùng trong MongoDB

Create table

CREATE TABLE people (id MEDIUMINT NOT NULL AUTO_INCREMENT, user_id Varchar(30), age Number, status char(1), PRIMARY KEY (id))

db.people.insertOne({User_id: abc123, Age: 55, Status: A})

Drop table

DROP TABLE people

db.people.drop()

Insert records into tables

INSERT INTO people(user_id, age, status) VALUES ("bcd001", 45, "A")

db.people.insertOne( { user_id: "bcd001", age: 45, status: "A" })

Select

SELECT *FROM people
db.people.find()

SELECT id,user_id, status FROM people
db.people.find( { }, { user_id: 1, status: 1 } )

SELECT * FROM people WHERE status = "A"
db.people.find( { status: "A" } )

SELECT * FROM people WHERE status = "A" AND age = 50
db.people.find( { status: "A", age: 50 } )

SELECT * FROM people WHERE status = "A" OR age = 50
db.people.find( { $or: [ { status: "A" }, { age: 50 } ] } )

SELECT * FROM people WHERE user_id like "%bc%"
db.people.find( { user_id: /bc/ } )
db.people.find( { user_id: { $regex: /bc/ } } )

SELECT COUNT(user_id) FROM people
db.people.count( { user_id: { $exists: true } } )
db.people.find( { user_id: { $exists: true } } ).count()

Update records

UPDATE people SET status = "C" WHERE age > 25
db.people.updateMany( { age: { $gt: 25 } }, { $set: { status: "C" } } )

UPDATE people SET age = age + 3 WHERE status = "A"
db.people.updateMany( { status: "A" }, { $inc: { age: 3 } } )

Delete Records

DELETE FROM people WHERE status = "D"
db.people.deleteMany( { status: "D" } )

DELETE FROM people
db.people.deleteMany({})

Specify Conditions Using Query Operators

Bạn cũng có thể địn nghĩa các điều kiên bằng các biểu thức điều kiện với các toán tử so sanh cụ thể như sau :

Biểu thức Mô tả
$eq Phép so sánh bằng
$ne Phép so sánh khác (Nhận các giá trị không bằng)
$gt Phép so sanh lớn hơn
$gte Phép so sanh lớn hơn hoặc bằng
$lt Phép so sánh nhỏ hơn
$lte Phép so sánh nhỏ hơn hoặc bằng
$in Phép so sánh với 1 trong các phần tử của mảng
$nin Phép so sánh khác với tất cả các phần tử của mảng

Các toán tử logic

Biểu thức Mô tả
$and Các bản ghi hợp lệ là các bản ghi đúng với tất cả điều kiện
$or Các bản ghi hợp lệ là các bản ghi đúng với một trong các điều kiện
$not Các bản ghi hợp lệ là các bản ghi không đúng 1 trong các điều kiện
$nor Các bản ghi hợp lệ là các bản ghi không đúng với tất cả điều kiện

Tham khảo: