Khi xử lý dữ liệu có hai kiểu dữ liệu mà ta có thể gặp là:
- Dữ liệu có cấu trúc
- Dữ liệu phi cấu trúc
Dữ liệu cấu trúc thường được lưu trữ dạng bảng trong khi dữ liệu phi cấu trúc thì không. Để quản lý các tập hợp dữ liệu phi cấu trúc như log, dữ liệu IoT, big data,.... Các cơ sở dữ liệu NoSQL được sử dụng.
- MongoDB là cơ sở dữ liệu NoSQL mã nguồn mở được viết bằng C++. Nó sử dụng tài liệu dạng JSON để lưu trữ dữ liệu.
- Nó là một cơ sở dữ liệu hướng tài liệu, cung cấp khả năng mở rộng dễ dàng, đa nền tảng.
- MongoDB hoạt động dựa trên khái niệm Collection và Document.
- Nó kết hợp khả năng mở rộng quy mô với các tính năng như chỉ mục thứ cấp, truy vấn phạm vi, sắp xếp, tổng hợp và chỉ mục không gian địa lý.
- MongoDB được phát triển bởi MongoDB Inc. và được cấp phép theo Server Side Public License (SSPL).
2. Document trong MongoDB là gì?
3. Collection trong MongoDB là gì?
4. Cơ sở dữ liệu trong MongoDB
6. Scale-Out xảy ra như thế nào trong MongoDB?
8. Làm sao để thêm dữ liệu trong MongoDB?
9. Làm thế nào để cập nhật một document?
11. Làm sao để truy vấn trong MongoDB?
12. Các kiểu dữ liệu trong MongoDB?
14. Giải thích về indexing trong MongoDB?
15. Chỉ mục địa lý (Geospatial Indexes) trong MongoDB?
16. Giải thích về quá trình sharding?
17. Giải thích về SET trong MongoDB?
18. Transaction trong MongoDB?
20. Aggregation trong MongoDB là gì?
21. Giải thích về khái niệm pipeline trong MongoDB?
22. Replica Set trong MongoDB là gì?
23. Giải thích về kiến trúc Replication trong MongoDB?
24. Một số tiện ích để sao lưu và khôi phục trong MongoDB là gì?
- Hiệu suất cao
- Tính sẵn sàng cao – Nhân rộng
- Khả năng mở rộng cao – Sharding
- Năng động – Không có lược đồ cứng nhắc.
- Linh hoạt – thêm / xóa trường có ít hoặc không ảnh hưởng đến ứng dụng
- Dữ liệu không đồng nhất
- Không joins
- Phân phối được
- Biểu diễn dữ liệu trong JSON hoặc BSON
- Hỗ trợ không gian địa lý (Geospatial)
- Tích hợp dễ dàng với BigData Hadoop
Một document trong MongoDB là một tập hợp key/value. Nó được biểu diễn bằng map, hash, hoặc dictionary. Trong JavaScript, document được biểu diễn dưới dạng các đối tượng:
{"greeting": "Hello world!"}
Các document phức tạp sẽ chứa nhiều cặp key/value:
{
"welcome": "Hello world!",
"views": 3
}
Collection là một nhóm document. Nếu một document trong MongoDB tương tự như một hàng trong SQL, thì một collection sẽ tương tự như một bảng.
Các document trong cùng một collection có thể khác nhau,... do tính chất lược đồ dữ liệu động.
Ví dụ:
{"greeting" : "Hello world!", "views": 3}
{"signoff": "Good bye"}
Tập hợp các collection nằm trong cơ sở dữ liệu. MongoDB có thể có nhiều cơ sở dữ liệu, mỗi cơ sở dữ liệu chứa nhiều collection.
Một số tên cơ sở dữ liệu dành riêng như sau:
- admin
- local
- config
Nó là một JavaScript shell cho phép tương tác với một phiên bản MongoDB từ dòng lệnh. Nhờ đó, người ta có thể thực hiện các chức năng quản trị, kiểm tra một phiên bản hoặc sử dụng MongoDB.
Để bắt đầu shell, ta chạy lệnh mongo:
$ mongod
$ mongo
MongoDB shell version: 4.2.0
connecting to: test
>
Shell là một trình thông dịch JavaScript đầy đủ tính năng, có khả năng chạy các chương trình JavaScript tùy ý. Hãy xem cách phép toán cơ bản hoạt động:
> x = 100;
200
> x / 5;
20
Để scale out trong MongoDB, ta thực hiện Sharding.
Sharding là một phương pháp để lưu trữ dữ liệu (storage) của cơ sở dữ liệu trên nhiều máy chủ. MongoDB sử dụng sharding để hỗ trợ việc phân tán một lượng dữ liệu trên nhiều máy chủ, ở đây có thể là các tập collection trong DB điều này giúp cho việc truy cập nhanh hơn, giảm tải việc quá tải ổ cứng cho một vài máy chủ và giúp hệ thống dễ dàng mở rộng khi có nhu cầu hơn.
Mongodb Sharded Cluster bao gồm các thành phần chính như sau:
- Shards: Là nơi chứa dữ liệu, được phân tán bởi nhiều máy chủ theo cơ chế "replica set".
- Query routers - Mongos: Là nơi điều hướng việc client truy cập chính xác dữ liệu vào shard nào, mỗi hệ thống Sharding có thể có nhiều query router.
- Config servers: Là nơi chưa các metadata (nôm na là các thông số kỹ thuật) của hệ thống Sharding, nó chứa một bản đồ dữ liệu của việc thiết lập các Shards. Query routers dùng các metadata này xác định được chính xác việc truy vấn vào Shards nào trên hệ thống. Mỗi hệ thống Sharding có chính xác là 3 file Config servers.
- Indexing hỗ trợ chỉ mục thứ cấp và cung cấp tính năng đánh chỉ mục duy nhất, đa hợp, không gian địa lý và toàn văn bản.
- Aggregation cung cấp framework aggregation dựa trên khái niệm xử lý dữ liệu trong pipelines.
- Special collection và index types: nó hỗ trợ time-to-live collection cho dữ liệu sẽ hết hạn vào một thời điểm nhất định.
- File storage cung cấp giao thức đơn giản cho lưu trữ file và thông tin file.
- Sharing là quá trình chia sẽ dữ liệu trên nhiều máy.
Phương thức thêm dữ liệu cơ bản trong MongoDB là "insert". Để thêm một document ta dùng insertOne
:
> db.books.insertOne({"title": "Start With Why"})
Để thêm nhiều document vào một collection, ta có thể dùng insertMany
, phương thức này cho phép chuyển một mảng document vào cơ sở dữ liệu.
Sau khi document được lưu trữ trong cơ sở dữ liệu, nó có thể được cập nhật bằng một trong các phương pháp sau: updateOne
, updateMany
và replaceOne
.
updateOne
và updateMany
mỗi cái lấy một document lọc làm tham số đầu tiên và một document chỉnh sửa làm tham số thứ hai. replaceOne
cũng lấy một bộ lọc làm tham số đầu nhưng với tham số thức hai, replaceOne
sẽ mong đợi tài liệu thay thế phù hợp với filter.
{
"_id" : ObjectId("4b2b9f67a1f631733d917a7a"),
"name" : "alice",
"friends" : 24,
"enemies" : 2
}
Xoá trong MongoDB được hỗ trợ bằng deleteOne
và deleteMany
. Cả hai phương thức này đều nhận vào một bộ lọc document làm tham số đầu tiên. Bộ lọc chỉ định một tập hợp các tiêu chí phù hợp với việc xoá document.
> db.books.deleteOne({"_id" : 3})
Phương thức find
được dùng để thực hiện truy vấn trong MongoDB. Truy vấn trả về một tập con document trong một collection, có thể là không có document nào cũng có thể là toàn bộ. Document được trả về được xác định bởi tham số đầu tiên cần tìm là tiêu chí truy vấn document.
> db.users.find({"age" : 24})
MongoDB hỗ trợ nhiều kiểu dữ liệu dưới dạng giá trị trong document. Các document trong MongoDB tương tự như các đối tượng trong JavaScript. Cùng với bản chất key/value thiết yếu của JSON, MongoDB bổ sung hỗ trợ cho một số kiểu dữ liệu bổ sung. Các kiểu dữ liệu phổ biến trong MongoDB là:
- Null
{"x" : null}
- Boolean
{"x" : true}
- Number
{"x" : 4}
- String
{"x" : "foobar"}
- Date
{"x" : new Date()}
- Regular expression
{"x" : /foobar/i}
- Array
{"x" : ["a", "b", "c"]}
- Embedded document
{"x" : {"foo" : "bar"}}
- Object ID
{"x" : ObjectId()}
-
Binary Data là một chuỗi các byte tùy ý.
-
Code {"x" : function() { /* ... */ }}
Bạn nên sử dụng MongoDB khi bạn đang xây dựng các ứng dụng internet và doanh nghiệp cần phát triển nhanh chóng và mở rộng quy mô một cách gọn gàng. MongoDB phổ biến với các nhà dev đang xây dựng các ứng dụng có khả năng mở rộng bằng cách sử dụng các phương pháp agile.
MongoDB là một lựa chọn tuyệt vời nếu bạn cần:
- Hỗ trợ phát triển lặp đi lặp lại nhanh chóng.
- Mở rộng quy mô đến mức cao của lưu lượng đọc và ghi - MongoDB hỗ trợ mở rộng quy mô theo chiều ngang thông qua Sharding, phân phối dữ liệu trên một số máy và tạo điều kiện cho các hoạt động thông lượng cao với bộ dữ liệu lớn.
- Quy mô kho dữ liệu của bạn có một kích thước lớn.
- Phát triển loại hình triển khai khi doanh nghiệp thay đổi.
- Lưu trữ, quản lý và tìm kiếm dữ liệu với các văn bản, không gian địa lý hoặc chuỗi thời gian.
Chỉ mục (Index) hỗ trợ việc phân giải các truy vấn hiệu quả hơn. Nếu không có chỉ mục, MongoDB phải quét qua mọi Document của một Collection để chọn các Document mà kết nối với lệnh truy vấn. Việc quét này có thể không hiệu quả và yêu cầu MongoDB xử lý một số lượng lớn dữ liệu.
Chỉ mục (Index) là các cấu trúc dữ liệu đặc biệt, lưu giữ một phần nhỏ của tập hợp dữ liệu, giúp việc độc collection một cách dễ dàng hơn. Chỉ mục lưu giữ giá trị của một trường cụ thể hoặc tập hợp các trường, được sắp xếp bởi giá trị của trường như đã được xác định trong chỉ mục.
Để tạo chỉ mục, có thể dùng phương thức createIndex
. Ví dụ:
> db.users.find({"username": "user101"}).explain("executionStats")
Ở đây, chế độ executionStats
giúp ta hiểu tác dụng của việc sử dụng một chỉ mục để đáp ứng các truy vấn.
MongoDB có hai loại chỉ mục đia lý là: 2d và 2dsphere.
Chỉ mục 2dsphere làm việc với các hình cầu mô phỏng bề mặt trái đất dựa trên hệ toạ độ WGS-84. Hệ toạ độ này mô hình hoá bề mặt trái đất như một hình cầu phẳng. Do đó, ác phép tính khoảng cách sử dụng chỉ mục 2dsphere, sẽ tính đến hình dạng của trái đất và cung cấp cách xử lý chính xác hơn về khoảng cách giữa hai thành phố.
Ví dụ: Tính toán khoảng cách giữa hai thành phố
- Sử dụng chỉ mục 2d cho các điểm lưu trữ trên mặt phẳng hai chiều:
{
"name" : "New York City",
"loc" : {
"type" : "Point",
"coordinates" : [50, 2]
}
}
- 2dsphere cho phép bạn chỉ định các điểm, đường thẳng, đa giác ở dạng GeoJSON. Một điểm được biểu diễn bởi một mảng hai phần tử[kinh độ, vĩ độ]:
{
"name" : "Hudson River",
"loc" : {
"type" : "LineString",
"coordinates" : [[0,1], [0,2], [1,2]]
}
}
Sharding là quá trình chia nhỏ dữ liệu giữa các máy. Đôi khi người ta cũng sử dụng thuật ngữ "partitioning" để mô tả khái niệm này. Ta có thể lưu trữ nhiều dữ liệu hơn và xử lý nhiều tải hơn mà không yêu cầu cấu hình máy mạnh hơn, bằng cách đặt một tập con dữ liệu trên mỗi máy.
Trong hình bên dưới, RS0 và RS1 là shards. Sharding trong MongoDB cho ta tạo một cụm gồm nhiều máy (shards) và chia các tập hợp trên đó. Đặt các tập con dữ liệu vào mỗi shard. Nó cho phép ứng dụng của bạn phát triển vượt ngoài giới hạn của một server độc lập.
Nếu giá trị của trường không tồn tại, thiết lập $set
giá trị có thể hữu ích cho cập nhật lược đồ hay thêm khoá người dùng định nghĩa.
> db.users.findOne()
{
"_id" : ObjectId("4b253b067525f35f94b60a31"),
"name" : "alice",
"age" : 23,
"sex" : "female",
"location" : "India"
}
Để thêm trường vào ta có thể dừng $set
:
> db.users.updateOne({"_id" :
ObjectId("4b253b067525f35f94b60a31")},
... {"$set" : {"favorite book" : "Start with Why"}})
Transaction là một đơn vị xử lý logic trong cơ sở dữ liệu bao gồm một hoặc nhiều thao tác cơ sở dữ liệu, có thể là thao tác đọc hoặc ghi. Transaction cung cấp một tính năng hữu ích trong MongoDB để đảm bảo tính nhất quán.
MongoDB cung cấp 2 API cho sử dụng transaction là:
- Core API: tương tực với cú pháp của cơ sở dữ liệu quan hệ (start_transaction và commit_transaction)
- Call-back API: Đây là cách tiếp cận được khuyến nghị để sử dụng các transaction. Nó bắt đầu một transaction, thực hiện các hoạt động được chỉ định và commit (hoặc hủy bỏ do lỗi). Nó cũng tự động kết hợp logic xử lý lỗi cho "TransientTransactionError" và "UnknownTransactionCommitResult".
MongoDB Charts là một công cụ để tạo các minh họa trực quan cho dữ liệu MongoDB của bạn. Trực quan hóa dữ liệu là một thành phần quan trọng để cung cấp sự hiểu biết rõ ràng về dữ liệu của bạn, làm nổi bật mối tương quan giữa các biến và giúp bạn dễ dàng phân biệt các mẫu và xu hướng trong bộ dữ liệu của mình. Biểu đồ MongoDB giúp cho việc truyền tải dữ liệu của bạn trở nên đơn giản hơn bằng cách cung cấp các công cụ có sẵn để dễ dàng chia sẻ và cộng tác trên các hình ảnh trực quan.
Có hai cách triển khai MongoDB Charts là:
- MongoDB Charts PaaS
- MongoDB Charts Server
Aggregation là một framework tổng hợp dữ liệu của MongoDB. Aggregation được xây dựng dựa trên mô hình xử lý dữ liệu dưới dạng pipeline.
Aggregation pipeline bao gồm nhiều giai đoạn. Trong mỗi giai đoạn, chúng ta sử dụng một aggregation operator để biến đổi dữ liệu của các input document. Các output document của giai đoạn phía trước sẽ là input document của giai đoạn ngay sau. Các aggregation operator có thể được sử dụng nhiều lần trong pipeline, ngoại trừ $out
, $merge
, và $geoNear
.
Một giai đoạn riêng lẻ của một aggregation pipeline là một đơn vị xử lý dữ liệu. Nó nhận từng dòng document đầu vào, xử lý từng document một và tạo ra từng dòng document đầu ra (xem hình bên dưới).
Để giữ các bản sao dữ liệu giống hệt nhau trên nhiều server, ta sử dụng tính năng replication (sao chép). Sử dụng replication sẽ giữ cho ứng dụng của bạn chạy và dữ liệu của bạn an toàn, ngay cả khi có điều gì đó xảy ra với một hoặc nhiều server.
Replication như vậy có thể được tạo bởi một replica set với MongoDB. Replica set là một nhóm các tiến trình của Mongodb duy trì cùng một bộ dữ liệu. Các replica set cung cấp tính dự phòng và tính sẵn sàng cao và là cơ sở để triển khai nhập xuất dữ liệu khi cần thiết.
- Một replica set chỉ có duy nhất một primary. Primary sẽ nhận các yêu cầu ghi. Primary ghi các thay đổi của nó vào oplog.
- Các secondary sẽ có chung data set với primary, các yêu cầu đọc có thể scale trên primary và tất cả các secondary. Một replica set có thể có tối đa là 50 member.
- Các member luôn giữ duy trì kết nối, trong trường hợp một member chết thì các member khác sẽ tự động được chuyển đổi dự phòng. Đây là một điểm khác biệt so với mysql.
Mongo shell không bao gồm các chức năng xuất, nhập, sao lưu hoặc khôi phục. Tuy nhiên, MongoDB đã tạo ra các phương thức để thực hiện điều này, do đó không cần đến việc viết script hoặc GUI phức tạp. Ở đây, một số script tiện ích được cung cấp có thể được sử dụng để lấy dữ liệu vào hoặc ra cơ sở dữ liệu hàng loạt. Các script tiện ích này là:
- mongoimport
- mongoexport
- mongodump
- mongorestore