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 bằng cách sử dụng các tài liệu JSON-like. Trong bài viết này, chúng ta sẽ khám phá các 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 một 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 (data type) khác nhau:
{ "greeting": "Hello, world!", "foo": 3, "tags": ["mongodb", "database", "NoSQL"], "address": { "street": "123 Main St", "city": "Anytown" }
}
Key/value
Trong 1 document, data type của key phải là string. Key chấp nhận bất cứ ký tự UTF-8 nào, ngoại trừ:
- Không được để empty string.
- Không chứa ký tự
\0
. - Tránh sử dụng
.
và$
.
Phân biệt chữ hoa và chữ thường
MongoDb phân biệt hoa thường khi làm việc với key. Ví dụ:
{ "foo": 3
}
{ "foo": "3"
}
{ "Foo": 3
}
Lưu ý là các document ở ví dụ trên đều khác nhau. MongoDb không chấp nhận trùng key trong 1 document.
Collection trong MongoDB
Collection bao gồm nhóm các document. Nếu document là record, thì collection là table:
- Collection có thể chứa các record có cấu trúc khác nhau.
- Tên collection phải tuân theo các quy tắc như:
- Không được rỗng.
- Không chứa ký tự
\0
. - Tránh bắt đầu bằng
system.
. - Không chứa ký tự
$
.
Dynamic Schemas
Trong 1 collection thì có thể có các document với các kiến trúc khác nhau, cho phép lưu trữ các loại dữ liệu đa dạng trong cùng một collection.
{ "greeting": "Hello, world!" }
{ "foo": 5 }
Subcollections
Subcollections được tổ chức bằng cách sử dụng ký tự .
:
{ "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 rỗng.
- Không chứa ký tự đặc biệt như
/
,\
,.
,"
,*
,<
,>
,:
,|
,?
,$
, khoảng trắng đơn và\0
. - Phân biệt chữ hoa 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
: Dùng trong 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:
{ "database": "cms", "collection": "blog.posts", "namespace": "cms.blog.posts"
}
Namespace bị giới hạn độ dài tối đa là 121 byte.
MongoDb mở rộng JSON
- MongoDB support 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
- Cách mà value thể hiện kiểu dữ liệu có thể phụ thuộc tùy theo từng ngôn ngữ lập trình. Tuy nhiên, dưới đây sẽ là danh sách các kiểu dữ liệu được hỗ trợ phổ biến trong shell của MongoDB.
null
- Giá trị null: Có thể được sử dụng để biểu diễn cả giá trị null và trường không tồn tại.
{ "x": null }
boolean
- Giá trị boolean: Có thể sử dụng để lưu trữ các giá trị
true
vàfalse
.{ "x": true }
number
-
Số: Shell mặc định sử dụng các số dấu phẩy động 64-bit. Do đó, các số này trông "bình thường" trong shell.
{ "x": 3.14 }
hoặc
{ "x": 3 }
-
Số nguyên: Để biểu diễn số nguyên, sử dụng các lớp
NumberInt
hoặcNumberLong
, lần lượt biểu diễn các số nguyên có dấu 4-byte hoặc 8-byte.{ "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.
{ "x": "foobar" }
date
- Ngày tháng: Ngày tháng được 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ữ.
{ "x": new Date() }
regular expression
- Biểu thức chính quy: Các truy vấn có thể sử dụng biểu thức chính quy theo cú pháp của JavaScript.
{ "x": /foobar/i }
array
- Mảng (array): Mảng là 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.
- Ví dụ:
{ "x": ["a", "b", "c"] }
- Trong ví dụ trên,
x
là một mảng chứa ba chuỗi:"a"
,"b"
, và"c"
.
- Ví dụ:
embedded document
- embedded document: 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.
- Ví dụ:
{ "x": { "foo": "bar" } }
- Trong ví dụ trên,
x
là một tài liệu nhúng chứa một cặp khóa/giá trị:"foo": "bar"
.
- Ví dụ:
object id
- ObjectId: ObjectId là một ID 12-byte được sử dụng làm định danh duy nhất cho các tài liệu.
- Ví dụ:
{ "x": ObjectId() }
- Trong ví dụ trên,
x
là một ObjectId được tạo mới.
- Ví dụ:
Giải thích chi tiết về các kiểu dữ liệu ít phổ biến hơn trong MongoDB
binary data
- Dữ liệu nhị phân (binary data):
- Mô tả: Dữ liệu nhị phân là một chuỗi byte tùy ý. Dữ liệu này không thể được thao tác trực tiếp từ shell MongoDB.
- Lưu trữ chuỗi không phải UTF-8: Dữ liệu nhị phân là cách duy nhất để lưu trữ các chuỗi không phải UTF-8 trong cơ sở dữ liệu MongoDB.
- Ví dụ:
{ "x": BinData(0, "binary data here") }
Code
- Code:
- Mô tả: Lệnh truy vấn cũng như document cũng có thể chứa mã JavaScript tùy ý.
- Ví dụ:
{ "x": function() { /* ... */ } }
Các kiểu dữ liệu khác:
- Kiểu dữ liệu sử dụng nội bộ: 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 linh hoạt và mạnh mẽ để quản lý dữ liệu phi cấu trúc. Hiểu rõ các khái niệm cơ bản như tài liệu, collection, database và namespace 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 để đảm bảo 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.