MongoDB là CSDL mã nguồn mở NoSQL, được viết bằng C++.
Là 1 CSDL đa nền tảng, hoạt động trên các khái niệm Collection và Document, cung cấp hiệu suất cao, khả năng mở rộng dễ dàng.
Các thuật ngữ trong MongoDB
- _id: là trường bắt buộc có trong mỗi document. _id đại diện cho 1 giá trị duy nhất của document đó. _id có thể hiểu là khóa chính trong document.
- Collection: là nhóm của nhiều document. Collection có thể hiểu là 1 bảng tương ứng trong MySQL. Collection nằm trong 1 CSDL duy nhất. Các Collection không phải định nghĩa cột, hàng hay kiểu dữ liệu.
- Cursor: là con trỏ đến tập kết quả của 1 truy vấn.
- Database: nơi chứa các Collection, giống database trong MySQL. Mỗi database có 1 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: 1 bản ghi thuộc 1 collection. Các document bao gồm tên và giá trị.
- Field: 1 cặp name – value trong document. 1 document có thể có 0 hoặc nhiều field.
- Json (viết tắt của javascript object notation). Là 1 kiểu định dạng dữ liệu mà hầu hết các ứng dụng đều đọc và xử lý được. Json sử dụng cặp giá trị key – value. Ví dụ:
JSON
{
"name": "Smartweb",
"title": "Thiết kế website"
}- Index: là những cấu trúc đặc biệt, dùng để chứa 1 phần nhỏ của các tập dữ liệu 1 cách dễ dàng để quét. Index lưu trữ giá trị của 1 field cụ thể hoặc thiết lập các field, sắp xếp giá trị các field này. Index giúp MongoDB phân tích truy vấn 1 cách hiệu quả thay vì phải quét tất cả các document của collection.
Lưu ý index không phải là _id.
So sánh MySQL và MongoDB:
| Database | Database |
| Table | Collection |
| Row | Document |
| Column | Field |
Ví dụ Embedded Documents:
JSON
{
_id: ObjectId("5099803df3f4948bd2f98391"),
name: { first: "David", last: "Beckham"},
contact: { phone: { type: "cell", number: "0933-339-394" } },
}Để gọi field last trong nam, ta dùng name.last. Để chỉ field number ta dùng contact.phone.number.
_id là do hệ thống tự tạo ra để làm khóa chính.
Các kiểu dữ liệu trong MongoDB:
| Type | Number | Alias | Description |
| Double | 1 | “double” | Số thực |
| String | 2 | “string” | Kiểu phổ biến nhất, phải là UTF-8 hợp lệ |
| Object | 3 | “object” | Sử dụng cho các Document được nhúng vào |
| Array | 4 | “array” | Mảng |
| Binary data | 5 | “binData” | Dữ liệu nhị phân |
| Undefined | 6 | “undefined” | |
| ObjectId | 7 | “objectId” | Lưu trữ Id của Document |
| Boolean | 8 | “bool” | true/false |
| Date | 9 | “date” | Date time trong định dạng UNIX time |
| Null | 10 | “null” | Lưu trữ 1 giá trị null |
| Regular Expression | 11 | “regex” | Lưu trữ biểu thức chính quy |
| DBPointer | 12 | “dbPointer” | |
| Javascript | 13 | “javascript” | Lưu trữ javascript code |
| Symbol | 14 | “symbol” | Chuỗi |
| Javascript (with scope) | 15 | “javascriptWithScope” | |
| 32-bit integer | 16 | “int” | Số nguyên |
| Timestamp | 17 | “timestamp” | Ghi dấu thời điểm thêm mới/cập nhật |
| 64-bit integer | 18 | “long” | Số nguyên |
| Decimal 128 | 19 | “decimal” | |
| Min key | -1 | “minKey” | So sánh một giá trị với các phần tử BSON thấp nhất và cao nhất |
| Max key | 127 | “maxKey” | So sánh một giá trị với các phần tử BSON thấp nhất và cao nhất |
Một số câu lệnh trong MongoDB
| Câu lệnh | SQL | 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” AND age = 50 | db.people.find( {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({}) |
MongoDB hoạt động như thế nào?
- MongoDB hoạt động dưới 1 tiến trình ngầm service, luôn mở 1 cổng (mặc định 27017) để lắng nghe truy vấn.
- Mỗi bản ghi của MongoDB được tự động gắn thêm 1 field _id, thuộc kiểu dữ liệu ObjectId, tự động đánh index.
- Khi có truy vấn, bản ghi được cache lên RAM để phục vụ lượt truy cập sau.
- Khi có yêu cầu thêm/sửa/xóa, sau 60s MongoDB mới thực hiện ghi dữ liệu từ RAM xuống ổ cứng.
Ưu điểm của MongoDB:
- Ít schema hơn: vì trong 1 collection có thể chứa nhiều document khác nhau. Mỗi document lại có thể có số field, nội dung, kích thước khác nhau.
- Cấu trúc đối tượng rõ ràng.
- Khả năng mở rộng cực lớn.
- Truy cập dữ liệu nhanh.
Một số công cụ quản trị MongoDB:
- RoboMongo
- UMongo
- MongoExplorer
- RockMongo
