Tìm hiểu về MongoDB: Cơ sở dữ liệu NoSQL linh hoạt và mạnh mẽ
MongoDB là một cơ sở dữ liệu NoSQL mạnh mẽ, cho phép lưu trữ và truy vấn dữ liệu linh hoạt dưới dạng các tài liệu giống như JSON. Trong bài viết này, chúng ta sẽ khám phá những khái niệm cơ bản về MongoDB, bao gồm document, collection, subcollection, các kiểu dữ liệu, database, namespace, và các quy tắc đặt tên.
Document trong MongoDB
Document là đơn vị cơ bản của dữ liệu trong MongoDB, tương tự như một record trong cơ sở dữ liệu quan hệ. Mỗi document là một tập hợp các cặp key/value và có thể chứa nhiều kiểu dữ liệu khác nhau:
json
{
"greeting": "Hello, world!",
"foo": 3,
"tags": ["mongodb", "database", "NoSQL"],
"address": {
"street": "123 Main St",
"city": "Anytown"
}
}
Key/Value
Trong một document, key phải là kiểu string với các quy tắc như sau:
- Không được là empty string.
- Không được chứa ký tự
\0
. - Nên tránh sử dụng
.
và$
.
Phân biệt chữ hoa và chữ thường
MongoDB phân biệt chữ hoa và chữ thường khi xử lý key. Ví dụ:
json
{
"foo": 3
}
{
"foo": "3"
}
{
"Foo": 3
}
Tất cả các document trong ví dụ trên đều khác nhau, và MongoDB không cho phép trùng key trong cùng một document.
Collection trong MongoDB
Collection là một tập hợp các document. Nếu document là bản ghi, thì collection được xem như là một bảng:
- Collection có thể chứa các record có cấu trúc khác nhau.
- Tên collection phải tuân thủ các quy tắc:
- Không được rỗng.
- Không chứa ký tự
\0
. - Không được bắt đầu bằng
system.
. - Không được chứa ký tự
$
.
Dynamic Schemas
Trong một collection có thể có các document với cấu trúc khác nhau, cho phép lưu trữ nhiều loại dữ liệu đa dạng cùng một lúc.
json
{ "greeting": "Hello, world!" }
{ "foo": 5 }
Subcollections
Subcollections tổ chức dữ liệu bằng cách sử dụng ký tự .
:
json
{
"mainCollection": "blog",
"subCollection": "posts",
"namespace": "blog.posts"
}
Subcollections giúp tổ chức dữ liệu một cách có hệ thống và dễ quản lý.
Databases trong MongoDB
Database là một tập hợp các collection:
- Một instance của MongoDB có thể chứa nhiều database.
- Nên lưu trữ tất cả dữ liệu cho một ứng dụng trong cùng một database.
- Tên database phải tuân theo các quy tắc:
- Không được rỗng.
- Không chứa ký tự đặc biệt như
/
,\
,.
,"
,*
,<
,>
,:
,|
,?
,$
, và ký tự trống. - Phân biệt chữ hoa và chữ thường.
- Tối đa 64 byte.
Không được đặt tên cho database trùng với các tên sau:
admin
: Cơ sở dữ liệu gốc với quyền quản trị.local
: Không được sao chép, dùng để lưu trữ dữ liệu cục bộ.config
: Sử dụng để thiết lập phân mảnh, lưu trữ thông tin về các shard.
Namespace trong MongoDB
Namespace là tên đầy đủ của một collection, kết hợp tên database và tên collection:
json
{
"database": "cms",
"collection": "blog.posts",
"namespace": "cms.blog.posts"
}
Namespace có độ dài tối đa 121 byte.
MongoDB và các kiểu dữ liệu mở rộng JSON
MongoDB hỗ trợ nhiều kiểu dữ liệu nhưng vẫn giữ nguyên cấu trúc cặp key/value của JSON. Dưới đây là danh sách các kiểu dữ liệu phổ biến được hỗ trợ trong shell của MongoDB.
null
- Giá trị null: Được sử dụng để biểu diễn cả giá trị null và trường không tồn tại.
json
{ "x": null }
### boolean
- **Giá trị boolean:** Lưu trữ các giá trị `true` và `false`.
```json
{ "x": true }
number
- Số: Sử dụng number dấu phẩy động 64-bit. Trong shell, các số này trông "bình thường".
json
{ "x": 3.14 }
- **Số nguyên:** Sử dụng các lớp `NumberInt` hoặc `NumberLong` để biểu diễn số nguyên có dấu 4-byte hoặc 8-byte.
```json
{ "x": NumberInt("3") }
{ "x": NumberLong("3") }
string
- Chuỗi ký tự: Bất kỳ chuỗi ký tự UTF-8 nào cũng có thể được biểu diễn bằng kiểu dữ liệu string.
json
{ "x": "foobar" }
### date
- **Ngày tháng:** Ngày tháng lưu trữ dưới dạng số mili giây kể từ epoch (01/01/1970). Múi giờ không được lưu trữ.
```json
{ "x": new Date() }
regular expression
- Biểu thức chính quy: Sử dụng biểu thức chính quy theo cú pháp của JavaScript trong các truy vấn.
json
{ "x": /foobar/i }
### array
- **Mảng (array):** Tập hợp hoặc danh sách các giá trị, có thể chứa nhiều kiểu dữ liệu khác nhau.
```json
{ "x": ["a", "b", "c"] }
embedded document
- document nhúng: Một document có thể chứa các document khác làm value, cho phép tạo ra các cấu trúc dữ liệu phân cấp.
json
{ "x": { "foo": "bar" } }
### object id
- **ObjectId:** Một ID 12-byte được dùng làm định danh duy nhất cho các tài liệu.
```json
{ "x": ObjectId() }
Giải thích chi tiết về các kiểu dữ liệu ít phổ biến trong MongoDB
binary data
- Dữ liệu nhị phân (binary data): Là chuỗi byte tùy ý, không thể thao tác trực tiếp từ shell MongoDB, nhưng có thể lưu trữ các chuỗi không phải UTF-8.
json
{ "x": BinData(0, "binary data here") }
### Code
- **Code:** Lệnh truy vấn hay document cũng có thể chứa mã JavaScript tùy ý.
```json
{ "x": function() { /* ... */ } }
Các kiểu dữ liệu khác:
- Một số kiểu dữ liệu chủ yếu được sử dụng nội bộ hoặc đã bị thay thế bởi các kiểu dữ liệu khác. Những kiểu dữ liệu này sẽ được mô tả trong văn bản khi cần thiết.
Kết luận
MongoDB cung cấp một hệ thống mạnh mẽ và linh hoạt để quản lý dữ liệu phi cấu trúc. Việc hiểu rõ các khái niệm cơ bản như document, collection, database, và namespace sẽ giúp bạn tận dụng tối đa khả năng của MongoDB. Hãy tuân thủ các quy tắc đặt tên và tổ chức dữ liệu để hệ thống của bạn hoạt động hiệu quả và dễ quản lý. Nếu bạn có bất kỳ câu hỏi nào hoặc muốn biết thêm chi tiết, hãy tham khảo tài liệu chính thức của MongoDB hoặc các nguồn học tập uy tín khác.
source: viblo