1. Trang chủ
  2. » Luận Văn - Báo Cáo

Tìm hiểu về mongodb và thử nghiệm

68 12 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Tìm Hiểu Về Mongodb Và Thử Nghiệm
Tác giả Tô Bá Quyền
Người hướng dẫn TS. Phan Anh Phong
Trường học Trường Đại Học Vinh
Chuyên ngành Công Nghệ Thông Tin
Thể loại Báo Cáo Đồ Án Tốt Nghiệp
Năm xuất bản 2014
Thành phố Nghệ An
Định dạng
Số trang 68
Dung lượng 1,51 MB

Cấu trúc

  • CHƯƠNG 1: GIỚI THIỆU VỀ CƠ SỞ DỮ LIỆU QUAN HỆ (7)
    • 1.1. Một số khái niệm cơ bản (7)
    • 1.2. Cơ sở dữ liệu quan hệ (8)
    • 1.3. Ƣu điểm và nhƣợc điểm của CSDL quan hệ (0)
  • CHƯƠNG 2: CƠ SỞ DỮ LIỆU NOSQL (10)
    • 2.1. Đặt vấn đề (10)
    • 2.2. Các tiếp cận biểu diễn dữ liệu trong NoSQL (10)
  • CHƯƠNG 3: HỆ QUẢN TRỊ MONGODB (16)
    • 3.1. Giới thiệu (16)
    • 3.2. JSON (16)
    • 3.3. BSON (17)
    • 3.4. Văn bản (document) (18)
    • 3.5. Giá trị Null trong MongoDB (19)
    • 3.6. Mô hình dữ liệu (20)
    • 3.7. Tổ chức chỉ mục (21)
    • 3.8. Mô hình nhúng một – một (22)
    • 3.9. Mô hình nhúng một - nhiều (23)
    • 3.10. Mô hình tham chiếu một – nhiều (25)
    • 3.11. Mô hình tham chiếu nhiều – nhiều (26)
    • 3.12. Lựa chọn nhúng hay tham chiếu khi xây dựng CSDL trong MongoDB ? (28)
    • 3.13. Cài đặt và sử dụng MongoDB (29)
    • 3.14. Mối tương quan logic trong MongoDB (36)
    • 3.15. Ví dụ (37)
    • 3.16. Một số truy vấn (39)
  • CHƯƠNG 4: KẾT NỐI VỚI CƠ SỞ DỮ LIỆU MONGODB (40)
    • 4.1. Môi Trường .NET (40)
    • 4.2. Môi trường java (42)
  • CHƯƠNG 5: MỘT SỐ THỬ NGHIỆM VỚI MONGODB (48)
    • 5. Thảo luận về hiệu năng của MongoDB và MS SQL Server 2008 (48)
    • 6. Xây dựng BLOG với cơ sở dữ liệu lưu trữ MongoDB (54)
  • KẾT LUẬN (67)
  • TÀI LIỆU THAM KHẢO (68)

Nội dung

GIỚI THIỆU VỀ CƠ SỞ DỮ LIỆU QUAN HỆ

Một số khái niệm cơ bản

Dữ liệu là thông tin đã được ghi nhận, có thể dưới dạng thủ công hoặc máy tính, bao gồm tập tin, văn bản, hình ảnh và âm thanh Con người tiếp nhận và xử lý dữ liệu để trích xuất thông tin hữu ích Trong cơ sở dữ liệu, dữ liệu được tổ chức thành các tập hợp thông tin có cấu trúc, mô tả các đối tượng trong thế giới thực, chẳng hạn như thông tin về cuốn sách bao gồm tên sách, năm xuất bản và tác giả.

Thông tin là kết quả của việc phân tích dữ liệu, mang lại ý nghĩa cho người sử dụng Nó đại diện cho tri thức và hiểu biết của con người về một đối tượng cụ thể.

Giá trị NULL biểu thị những đối tượng chưa được xác định, mặc dù chúng có thể tồn tại Khái niệm này không mang lại ý nghĩa thực tế trong phân tích hoặc tính toán.

Ví dụ như những người không biết cha mẹ mình là ai thì giá trị cha mẹ sẽ được để là NULL mặc dù họ vẫn tồn tại

- Dữ liệu bán cấu trúc

Dữ liệu bán cấu trúc là loại dữ liệu có cấu trúc nhưng không hoàn toàn rõ ràng về ý nghĩa, khiến người dùng gặp khó khăn trong việc hiểu nội dung Mặc dù không tuân theo các mô hình của cơ sở dữ liệu quan hệ, dữ liệu bán cấu trúc vẫn bao gồm các trường riêng biệt Một ví dụ điển hình của dữ liệu bán cấu trúc là các trang web, nơi chứa các thẻ với dữ liệu có cấu trúc bên trong.

- Tính nhất quán của dữ liệu trong CSDL

ACID là viết tắt của bốn tính chất quan trọng trong quản lý cơ sở dữ liệu: Automicity (tính nguyên tố), Consistency (tính nhất quán), Isolation (tính tách biệt), và Durability (tính bền vững) Những tính chất này đảm bảo tính toàn vẹn của dữ liệu; nếu thiếu bất kỳ yếu tố nào, tính toàn vẹn sẽ bị đe dọa Chẳng hạn, trong giao dịch rút tiền tại ngân hàng, tính nhất quán đảm bảo rằng cả hai thao tác rút tiền và trừ tiền trong tài khoản đều được thực hiện an toàn và chính xác.

Nhất quán yếu là phương pháp đồng bộ dữ liệu không theo thời gian, nơi dữ liệu được cập nhật sau một khoảng thời gian nhất định, thường là 60 phút hoặc 1 ngày Mặc dù cách tiếp cận này giúp nâng cao hiệu suất hoạt động của hệ thống, nhưng nó không phù hợp cho những giao dịch yêu cầu tính nhất quán cao.

Web 2.0 là một xu hướng mới trong thiết kế vè phát triển web hiện nay mà mục đích của nó nhằm mang đến những thuận tiện trong quá trình chia sẻ dữ liệu Web 2.0 có vai trò nền tảng, cập nhật không ngừng Dễ dàng phát triển và có thể chạy trên mọi thiết bị.

Cơ sở dữ liệu quan hệ

Cơ sở dữ liệu quan hệ hiện nay là loại cơ sở dữ liệu phổ biến nhất, sử dụng mô hình quan hệ để mô tả thông tin qua các bảng và trường Việc sử dụng SQL để truy vấn dữ liệu giúp giảm thiểu sự dư thừa, đồng thời đảm bảo tính nhất quán và toàn vẹn của dữ liệu.

Cơ sở dữ liệu quan hệ được phát triển để giải quyết các vấn đề thực tiễn thông qua việc mô phỏng và trừu tượng hóa dữ liệu Mỗi người có cách phân tích và thiết kế khác nhau tùy thuộc vào yêu cầu sử dụng Hệ thống này cung cấp khả năng trừu tượng hóa dữ liệu qua ba lớp: lớp vật lý, lớp logic và lớp bên ngoài Sự phân chia này tạo ra hai tầng độc lập, bao gồm độc lập dữ liệu vật lý và độc lập dữ liệu logic.

Kiến trúc của cơ sở dữ liệu quan hệ

Để lưu trữ thông tin của cuốn sách vào cơ sở dữ liệu, chúng ta cần phân tích các thành phần quan trọng như tên sách, tên tác giả, nhà xuất bản, năm xuất bản và giá bán.

1.3 Ƣu điểm và nhƣợc điểm của CSDL quan hệ

CSDL quan hệ giúp giảm thiểu sự trùng lặp thông tin, đảm bảo tính nhất quán và toàn vẹn dữ liệu Nó cho phép thay đổi cấu trúc và dữ liệu mà không cần điều chỉnh chương trình ứng dụng Hơn nữa, CSDL quan hệ hỗ trợ nhiều người dùng truy cập đồng thời, với khả năng cung cấp các khung nhìn khác nhau cho từng loại người dùng.

Hiện nay, sự phát triển của web 2.0 và các mạng xã hội như Facebook, blog đã dẫn đến sự gia tăng đột biến về lượng dữ liệu và truy cập toàn cầu với hàng triệu người dùng cùng lúc Hàng tỷ nội dung được tạo ra và cập nhật liên tục, khiến các cơ sở dữ liệu quan hệ bộc lộ nhiều yếu điểm như khó khăn trong việc đánh chỉ mục dữ liệu lớn, phân trang và phân phối luồng dữ liệu media (phim, ảnh, nhạc) Để giải quyết vấn đề này, cần nâng cấp phần cứng và áp dụng các giải pháp phân tán Tuy nhiên, việc mở rộng cơ sở dữ liệu quan hệ cũng gặp nhiều khó khăn về sự nhất quán và chi phí phát triển, bảo trì lớn Do đó, cần một cơ sở dữ liệu mới để đáp ứng các yêu cầu hiện tại.

- Đa dạng hóa mô hình

Thế hệ cơ sở dữ liệu tiếp theo cần đáp ứng những tiêu chí như không ràng buộc, khả năng mở rộng ngang, xử lý khối lượng dữ liệu lớn và yêu cầu tài nguyên phần cứng tối thiểu Loại cơ sở dữ liệu này được gọi là NoSQL.

Ƣu điểm và nhƣợc điểm của CSDL quan hệ

Trước những hạn chế của cơ sở dữ liệu quan hệ, cần thiết phải phát triển một hệ quản trị cơ sở dữ liệu mới để khắc phục các yếu điểm này Để cải thiện khả năng xử lý dữ liệu lớn và tốc độ nhanh, chúng ta phải chấp nhận giảm tính ràng buộc và dư thừa dữ liệu Do đó, việc áp dụng mô hình quan hệ trở nên không cần thiết, dẫn đến khái niệm Non-Relational Hiện nay, có nhiều hướng phát triển cho cơ sở dữ liệu NoSQL.

2.2 Các tiếp cận biểu diễn dữ liệu trong NoSQL Đã có rất nhiều cơ sở dữ liệu được phát triển với nhiều hướng khác nhau để đáp ứng nhu cầu sử dụng Hiện nay có khoản 150 loại cơ sở dữ liệu NoSQL và chia làm nhiều loại Có bốn hướng phát triển chính hiện nay đó là hướng khóa-giá trị, hướng văn bản, hướng cột dữ liệu mở rộng và hướng đồ thị Mỗi hướng phát triển lại có một cách biểu diễn đối tƣợng khác nhau

Ví dụ trong cơ sở dữ liệu quan hệ ta mô tả một đối tƣợng học sinh cùng các thuộc tính của đối tƣợng này nhƣ sau:

HS01 Nguyễn Văn A 51k1 Đại Học Vinh Thì trong các cơ sở dữ liệu NoSQL sẽ đƣợc mô tả nhƣ sau:

2.2.1 Cơ sở dữ liệu dựa trên cặp khóa-giá trị Đây là một dạng cơ sở dữ liệu phi quan hệ đơn giản với cặp giá trị key-value Nó đơn giản nhất vì những phương thức của nó đơn giản, nhưng việc triển khai thực tế có thể khá phức tạp

Các đối tượng được lưu trữ bằng một khóa duy nhất, với tất cả các thuộc tính được gộp lại thành một giá trị Ví dụ, một đối tượng học sinh có thể được biểu diễn thành một dòng dữ liệu.

HS01 Họ và tên: Nguyễn Văn A Lớp 51K1 Trường đại học Vinh

Với 2 đối tƣợng trở lên ta biểu diễn thành nhiều dòng nhƣ sau:

HS01 Họ và tên: Nguyễn Văn A Lớp 51K1 Trường đại học Vinh

HS02 Họ và tên: Nguyễn Văn B Lớp 51K2 Trường đại học Vinh

CƠ SỞ DỮ LIỆU NOSQL

Đặt vấn đề

Trước những hạn chế của cơ sở dữ liệu quan hệ, cần thiết phải phát triển một hệ quản trị cơ sở dữ liệu mới để khắc phục những điểm yếu này Để cải thiện khả năng xử lý dữ liệu lớn và tốc độ nhanh, chúng ta phải chấp nhận giảm tính ràng buộc và dư thừa dữ liệu Do đó, mô hình quan hệ trở nên không cần thiết, dẫn đến sự xuất hiện của các cơ sở dữ liệu NoSQL.

Các tiếp cận biểu diễn dữ liệu trong NoSQL

Hiện nay, có khoảng 150 loại cơ sở dữ liệu NoSQL được phát triển với nhiều hướng khác nhau để đáp ứng nhu cầu sử dụng Các hướng phát triển chính bao gồm hướng khóa-giá trị, hướng văn bản, hướng cột dữ liệu mở rộng và hướng đồ thị, mỗi loại đều có cách biểu diễn đối tượng riêng biệt.

Ví dụ trong cơ sở dữ liệu quan hệ ta mô tả một đối tƣợng học sinh cùng các thuộc tính của đối tƣợng này nhƣ sau:

HS01 Nguyễn Văn A 51k1 Đại Học Vinh Thì trong các cơ sở dữ liệu NoSQL sẽ đƣợc mô tả nhƣ sau:

2.2.1 Cơ sở dữ liệu dựa trên cặp khóa-giá trị Đây là một dạng cơ sở dữ liệu phi quan hệ đơn giản với cặp giá trị key-value Nó đơn giản nhất vì những phương thức của nó đơn giản, nhưng việc triển khai thực tế có thể khá phức tạp

Các đối tượng được lưu trữ bằng một khóa duy nhất, trong đó tất cả các thuộc tính được gộp lại thành một giá trị Ví dụ, một đối tượng học sinh có thể được biểu diễn thành một dòng dữ liệu.

HS01 Họ và tên: Nguyễn Văn A Lớp 51K1 Trường đại học Vinh

Với 2 đối tƣợng trở lên ta biểu diễn thành nhiều dòng nhƣ sau:

HS01 Họ và tên: Nguyễn Văn A Lớp 51K1 Trường đại học Vinh

HS02 Họ và tên: Nguyễn Văn B Lớp 51K2 Trường đại học Vinh

Các khóa được lưu trên một mảng băm và trỏ đến vùng dữ liệu Cấu trúc của mảng này đƣợc biểu diễn nhƣ sau:

HS01 Họ và tên: Nguyễn Văn A Lớp 51K1 Trường đại học Vinh HS02 Họ và tên: Nguyễn Văn B Lớp 51K2 Trường đại học Vinh

Một số sản phần cơ sở dữ liệu theo hướng này là DynamoDB, Azure Table Storage, Redis

2.2.2 Cơ sở dữ liệu hướng văn bản (document store)

Cơ sở dữ liệu hướng văn bản lưu trữ dữ liệu dưới định dạng BSON, trong đó các đối tượng được lưu thành văn bản và các thuộc tính được tổ chức thành các trường với cặp khóa – giá trị.

Ví dụ biểu diễn 1 đối tượng học sinh dưới dạng văn bản trong NoSQL:

MaHS: "HS01", hovaten:"Nguyễn Văn A", lop:"51K1", truong: "Đại Học Vinh"

Trong đó đối tƣợng học sinh đƣợc biểu diễn bằng văn bản đƣợc đặt trong cặp dấu

"{}" Các thuộc tính được biểu diễn thành các cặp khóa-giá trị tương ứng như khóa

"hovaten" với giá trị "Nguyễn Văn An"

Với 2 đối tƣợng trở lên thì các đối tƣợng đƣợc ngăn cách với nhau bằng dấu „,‟ và chúng đƣợc biểu diễn nhƣ sau:

MaHS: "HS01", hovaten:"Nguyễn Văn A", lop:"51K1", truong: "Đại Học Vinh"

MaHS: "HS02", hovaten:"Nguyễn Văn B", lop:"51K2", truong: "Đại Học Vinh"

Với cơ sở dữ liệu hướng văn bản ta có thể sử dụng các truy vấn để truy xuất tất cả hay một phần của dữ liệu

Một số sản phầm cơ sở dữ liệu hướng văn bản tiêu biểu là MongoDB, Elasticsearch, Couchbase Server, CouchDB, RavenDB

2.2.3 Cơ sở dữ liệu hướng cột mở rộng

Trong cơ sở dữ liệu hướng cột, mỗi đối tượng được biểu diễn qua một dòng duy nhất Dòng này bao gồm một khóa để xác định đối tượng, trong khi các thuộc tính của đối tượng được thể hiện dưới dạng các cột với tên và giá trị tương ứng.

Ví dụ 1 đối tượng học sinh được biểu diễn dưới dạng cột như sau: row key Columns

Nguyễn Văn A 51K1 Đại học Vinh

Các cột trong mỗi dòng của cơ sở dữ liệu hướng cột là độc lập và không có mối liên hệ với nhau, mặc dù chúng có thể chia sẻ khóa giống nhau Dữ liệu được truy vấn dựa trên khóa, và các mối quan hệ giữa các đối tượng không thể được biểu diễn trong loại cơ sở dữ liệu này Ví dụ, khi biểu diễn hai đối tượng học sinh, các cột sẽ được tổ chức theo dạng row key và columns.

Nguyễn Văn A 51K1 Đại học Vinh

Nguyễn Văn B 51K2 Đại hoc Vinh

Cột là phần nhỏ nhất trong mỗi cơ sở dữ liệu nó chứa 1 tên, 1 giá trị và 1 timestamp:

Tên cột Giá trị Timestamp

- Tên cột phải là nhãn định sẵn hoặc đƣợc đặt bởi ứng dụng, có thể đánh chỉ mục cho cột

- Phần giá trị không nhất thiết phải có giá trị, đôi khi các thông tin lại đƣợc đƣa vào tên cột chứ không phải phần giá trị

- Timestamp là thời điểm thay đổi dữ liệu cuối, nó chấp nhận phần dữ liệu thay đổi cuối cùng

Thông thường các kiểu dữ liệu không được định sẵn mà nó sẽ tự chuyển sang kiểu dữ liệu mà ta insert vào

Các cột trong cơ sở dữ liệu không được lưu trữ theo thứ tự giá trị mà được sắp xếp theo tên cột, với các khóa cột được tổ chức theo thứ tự bảng chữ cái Ví dụ, thông tin về học sinh được lưu trữ trong file cột như sau:

@hocsinh/Truong = "Đại học Vinh"

Ngoài ra, còn có các supper column, là những cột chứa một tập hợp các cột khác Các cột bên trong supper column không được sắp xếp theo tên, mà có thể được trình bày dưới dạng: supper column column_name1 column_name2 column_name3.

Value1 Value2 Value3 timestamp timestamp timestamp

Supper column dùng để nhóm nhiều cột có mối liên hệ với nhau, hoặc một đặc tính chứ nhiều giá trị

Truong Đại học Vinh Đại học Y Vinh Đại học Thủy Lợi

Hoặc chứa các đối tƣợng khác:

Nguyễn Văn A 51K1 Đại học Vinh

ColumnDB tương tự như cơ sở dữ liệu quan hệ nhưng bị hạn chế nhiều về tính năng, không hỗ trợ "join" và chỉ cho phép truy vấn theo khóa Việc không có khả năng "join" giúp tăng hiệu suất hệ thống vì nó không cần truy xuất toàn bộ dữ liệu ColumnDB sử dụng chỉ mục để truy xuất dữ liệu, đảm bảo xác định chính xác vị trí lưu trữ mà không phải quét toàn bộ dữ liệu Mặc dù gặp nhiều hạn chế, ColumnDB vẫn nổi bật với khả năng mở rộng cao.

Những cơ sở dữ liệu tiêu biểu theo hướng này là Cassandra, Hypertable Accumulo, Amazon SimpleDB,

2.2.4 Cơ sở dữ liệu hướng đồ thị

Cơ sở dữ liệu hướng đồ thị mô tả các đối tượng thông qua các nút (nodes) và thuộc tính dưới dạng các trường khóa-giá trị trong mỗi nút Mối quan hệ giữa các đối tượng được thể hiện qua các cạnh (edges) với khóa-giá trị, và các cạnh này có thể có hướng hoặc không, tùy thuộc vào từng trường hợp cụ thể.

Biểu diễn mối quan hệ giữa học sinh, giáo viên và trường học dưới dạng đồ thị cho phép chúng ta hình dung rõ ràng hơn về các đối tượng như „ĐH Vinh‟, „Nguyễn Văn A‟ và „Nguyễn Văn B‟, được thể hiện qua các nút với thuộc tính riêng Các mối quan hệ như học sinh, giáo viên thuộc trường nào hay học sinh của ai được biểu diễn bằng các cạnh Trong mô hình này, các cạnh thể hiện các mối quan hệ là yếu tố quan trọng nhất, giúp chúng ta có cái nhìn trực quan về bài toán.

Cạnh là các đường nối giữa các nút, thể hiện mối quan hệ giữa hai đối tượng Thông tin quan trọng thường được lưu trữ trong các cạnh, giúp chúng ta hiểu rõ hơn về mối quan hệ giữa các nút, thuộc tính và các cạnh trong mô hình.

Một số phần mềm cơ sở dữ liệu hướng đồ thị tiêu biểu là : Neo4J, Infinite Graph, Sparksee, TiTan

Do thời gian tìm hiểu hạn chế và khả năng cá nhân còn có giới hạn, tôi không trình bày các phương pháp biểu diễn mối quan hệ giữa các đối tượng bằng NoSQL trong đề tài này Để biết thêm chi tiết, bạn có thể tham khảo các tài liệu trong phần tài liệu tham khảo.

2.2.5 Ƣu nhƣợc điểm của NoSQL

NoSQL Miền ứng dụng Điểm mạnh Điểm yếu

Khóa-giá trị - Dùng để lưu trữ phiên làm việc, hồ sơ, giỏ hàng

- truy vấn nhanh - dữ liệu lưu trữ không có cấu trúc

Văn bản - Dùng cho các ứng dụng cần đọc nhiều, quản lý nội dung nhƣ Blog, ứng dụng thời gian thực

- mô hình dữ liệu dễ hiểu, chịu tải cao, lập trình thân thiện

- không thể thực hiện các giao dịch phức tạp

Cột mở rộng - Dùng cho ứng dụng quản lý nội dung nhƣ Blog, web, cần lưu dữ liệu lớn

- lưu trữ dữ liệu trên các máy phân tán, truy vấn nhanh

- không thể truy vấn theo cột hay giá trị Đồ thị - Dùng cho dữ liệu không gian, thông tin định tuyến, các bài toán về đường đi

- -Khai thác các thuật toán đồ thị

- phải duyệt qua toàn bộ đồ thị khi truy vấn.

HỆ QUẢN TRỊ MONGODB

Giới thiệu

MongoDB là một cơ sở dữ liệu NoSQL mã nguồn mở hướng văn bản, có hiệu năng và tính mở rộng cao

Khác với các cơ sở dữ liệu quan hệ lưu trữ dữ liệu theo bảng, MongoDB sử dụng cấu trúc dữ liệu dạng văn bản dựa trên JSON với mô hình động gọi là BSON, giúp việc tích hợp dữ liệu cho ứng dụng trở nên dễ dàng hơn Mục tiêu của MongoDB là kết hợp ưu điểm của mô hình khóa - giá trị (tốc độ và khả năng mở rộng) với những chức năng phong phú của mô hình dữ liệu quan hệ.

MongoDB đƣợc sử dụng tốt nhất với những ứng dụng cần truy vấn động, cần tốc độ nhanh có lƣợng dữ liệu lớn

JSON

JSON là một định dạng dữ liệu nhẹ, sử dụng cú pháp JavaScript để mô tả đối tượng dưới dạng văn bản dễ hiểu Nhiều ngôn ngữ lập trình hiện nay đều hỗ trợ và hiểu cấu trúc của JSON.

Cấu trúc dữ liệu của JSON dựa trên các cặp Key/Value

- Key là một string, phải bắt đầu bằng một ký tự

- Value có thể là chuỗi, số, giá trị boolean hoặc đối tƣợng

JSON là một tập con của cú pháp JavaScript, bao gồm các cặp Key/Value Một đối tượng JSON bắt đầu bằng dấu "{" và kết thúc bằng dấu "}".

Trong lập trình, một key được định nghĩa là một chuỗi, theo sau là dấu ":" để phân tách với giá trị Nếu giá trị là chuỗi, nó cần được đặt trong cặp dấu “”, trong khi các giá trị số hoặc boolean không cần dấu nháy Đối với các đối tượng, cách xử lý phụ thuộc vào kiểu hỗ trợ của ngôn ngữ lập trình.

Ví dụ khi mô tả đối tƣợng học sinh bằng bảng trong mô hình quan hệ:

HS01 Nguyễn Văn A 20 51K1 Trong JSON đối tƣợng học sinh đƣợc biểu diễn nhƣ sau:

} Để biểu diễn 2 đối tƣợng trở lên, ta dùng một mảng các giá trị đƣợc nằm trong cặp dấu ngoặc vuông [ ] và cách nhau bởi dấu phẩy ","

Ví dụ biểu diễn 2 đối tƣợng học sinh bằng JSON: hocsinh : [

Trong ví dụ này, "hocsinh" là một con trỏ dẫn đến phần tử đầu tiên trong danh sách đối tượng học sinh JSON không lưu trữ con trỏ này, và mô hình của danh sách trong JSON được thể hiện như sau:

{MaHS: "HS01", HoVaTen : "Nguyễn Văn A", Tuoi: 20, Lop : "51K1"} hocsinh[0] hocsinh[1] hocsinh[2] hocsinh[3] hocsinh[4] hocsinh[5]

{MaHS: "HS02", HoVaTen : "Nguyễn Văn B", Tuoi: 20, Lop : "51K1"}

Chúng ta lấy họ và tên đối tƣợng thứ 1 của list nhƣ sau: hocsinh[0].HoVaTen

Kết quả là : "Nguyễn Văn A"

Lấy tuổi của đối tƣợng thứ 2 trong list: hocsinh[1].Tuoi

BSON

BSON được phát triển dựa trên JSON, mở rộng khả năng lưu trữ nhiều loại dữ liệu khác nhau Các kiểu dữ liệu được hỗ trợ trong BSON bao gồm nhiều định dạng phong phú, giúp tăng cường tính linh hoạt và khả năng lưu trữ của nó.

5 Binary Data Chuỗi nhị phân

8 Boolead Kiểu đúng sai (true/false)

11 Regular Expression Các ngoại lệ

14 JavaScript(with scope) JavaScript (with scope)

16 Timestamp Ngày tháng kiểu nhị phân

Văn bản (document)

Trong MongoDB, các đối tượng được biểu diễn dưới dạng văn bản, trong đó thuộc tính của đối tượng được thể hiện qua các cặp khóa - giá trị Khóa là tên thuộc tính, còn giá trị là giá trị tương ứng của thuộc tính đó Tất cả các đối tượng này được tổ chức thành một collection.

Ví dụ biểu diễn 1 đối tƣợng học sinh trong cơ sở dữ liệu quan hệ:

HS01 Nguyễn Văn A 20 51K1 Biểu diễn 1 đối tƣợng học sinh bằng văn bản:

Biểu diễn 2 đối tƣợng học sinh bằng văn bản: hocsinh:[{

Trong ví dụ này, "hocsinh" đại diện cho một khóa có giá trị là mảng chứa hai đối tượng học sinh Các đối tượng này được phân tách bằng dấu phẩy và được đặt trong dấu ngoặc vuông Cấu trúc của mảng tương tự như cấu trúc mảng trong JSON.

- Một mảng các documents nhƣ ví dụ trên cũng chỉ là một document, còn một collection là một tập hợp các documents

Các cặp khóa - giá trị trong văn bản được lưu trữ và truy xuất theo thứ tự, do đó, nếu hai văn bản có cùng cặp khóa - giá trị nhưng thứ tự khác nhau, chúng sẽ được lưu thành các mục riêng biệt.

Ví dụ trong cơ sở dữ liệu quan hệ không phân biệt thứ tự thuộc tính:

Nguyễn Văn An 30 30 Nguyễn Văn An

Trong MongoDB có phân biệt thứ tự các thuộc tính:

Document2 HoVaTen: "Nguyễn Văn An",

Tuoi:30, HoVaTen: "Nguyễn Văn An"

- Khóa trong văn bản là một string, bắt đầu là một ký tự

- MongoDB phân biệt chữ hoa chữ thường

Trong MongoDB, mỗi văn bản chỉ được phép chứa một khóa duy nhất, không chấp nhận các khóa trùng lặp Ví dụ, một văn bản có nhiều khóa giống nhau sẽ không hợp lệ.

{HoVaTen : "Nguyễn Văn An", HoVaTen : "Nguyễn Văn B"}

Giá trị Null trong MongoDB

Trong cơ sở dữ liệu quan hệ, việc thiết kế theo mô hình quan hệ yêu cầu rằng tất cả các cột của đối tượng phải có giá trị cụ thể hoặc có thể để null nếu giá trị không xác định được.

Trong MongoDB, các thuộc tính có thể được gán giá trị null và vẫn được xem như các khóa bình thường Tuy nhiên, do cấu trúc tự do và không ràng buộc của MongoDB, việc sử dụng giá trị null không thật sự cần thiết Nếu không có giá trị, người dùng có thể để trống mà không cần thêm cặp khóa-giá trị vào văn bản Khi thực hiện truy vấn, nếu cặp khóa-giá trị không tồn tại, nó sẽ không xuất hiện trong kết quả.

Mô hình dữ liệu

MongoDB là một cơ sở dữ liệu hướng văn bản, trong đó mỗi cơ sở dữ liệu có thể chứa nhiều collection Mỗi collection bao gồm các văn bản, mỗi văn bản được xác định bằng một khóa duy nhất gọi là "id", là chuỗi ObjectID Mặc dù chúng ta có thể gán giá trị số cho trường này để dễ quản lý, MongoDB vẫn tự động tạo ra một ObjectID Các văn bản trong MongoDB bao gồm nhiều trường, mỗi trường là một cặp khóa – giá trị.

Các cặp khóa – giá trị trong văn bản được sắp xếp theo thứ tự lưu trữ, và nếu hai văn bản có cùng các cặp khóa – giá trị nhưng vị trí sắp xếp khác nhau, thì chúng sẽ được coi là khác nhau Đặc biệt, trong một văn bản, các khóa không được trùng lặp và MongoDB phân biệt chữ hoa và chữ thường.

Cũng nhƣ các hệ quản trị cơ sở dữ liệukhác, MongoDB đƣa ra các khái niệm về mô hình dữ liệu của bản thân nó:

- Value: có thể bao gồm các kiểu dữ liệu cơ bản, kiểu dữ liệu tập hợp

- Key: là tên một thuộc tính

- Field: là một cặp key – value

- Document: Mỗi document chứa một tập các field

- Collection: Mỗi collection lưu trữ một tập các document

- Database: Mỗi database lưu trữ một tập các collection

A MongoDB server can host multiple databases, with each database containing one or more collections These collections are groups of documents that, in a logical sense, are similar to tables in relational databases.

Trong quá trình thao tác dữ liệu như insert hay update, chúng ta không cần phải định nghĩa trước cấu trúc của dữ liệu Một document được xem là một đơn vị dữ liệu, tương đương với một bản ghi không vượt quá 16MB, và mỗi document bao gồm một tập hợp các cặp key – value.

Dưới đây là Mối tương quan giữa RDMB và MongoDB

Mối tương quan giữa RDMB và MongoDB

Cấu trúc dữ liệu của MongoDB

Tổ chức chỉ mục

Tổ chức chỉ mục (index) trong MongoDB cũng đƣợc tổ chức giống với RDMB

Có nhiều cách tổ chức index nhƣng ở đây tôi chỉ giới thiệu về B-Tree

Cấu trúc thứ bậc trong tự nhiên có các nút gốc nằm ở đỉnh hệ thống, trong khi các nút lá được đặt ở phía dưới, như minh họa trong hình dưới đây.

B-tree là một cấu trúc dạng cây mà dữ liệu đƣợc sắp xếp dạng một cây cân bằng Cây cân bằng có nghĩa là độ dài từ gốc tới lá của mỗi chi nhánh là nhƣ nhau Nó đƣợc tối ƣu hóa cho các hệ thống đọc và ghi dữ liệu lớn

MongoDB luôn có chỉ số index mặc định được tạo ra trên trường id Trường _id luôn là duy nhất và nó không thể bị xóa.

Mô hình nhúng một – một

Trong các quan hệ một – một, để tối ưu hóa truy vấn, chúng ta có thể nhúng đối tượng này vào đối tượng kia, cho phép truy xuất tất cả thông tin chỉ trong một lần Đối tượng được nhúng sẽ trở thành một thuộc tính của đối tượng bị nhúng Ví dụ, mỗi học sinh sẽ có một lý lịch riêng biệt.

Sử dụng ánh xạ lan truyền id trong mô hình quan hệ và biểu diễn trong MongoDB:

{ _id: ObjectID(), MaHS: "HS01", HoVaTen: "Nguyễn Văn A", Lop: "51K1",

{ _id: ObjectID(), MaLL: "LL01", Cha: "Nguyễn Văn B", Me: "Lê Thị M"

Khi truy vấn thông tin học sinh, cần thực hiện một truy vấn bổ sung để lấy dữ liệu lý lịch Để tối ưu hóa quy trình này, chúng ta có thể nhúng thông tin lý lịch vào đối tượng học sinh dưới dạng thuộc tính lý lịch.

Cha: "Nguyễn Văn B", Me: "Lê Thị M"

Khi truy vấn thông tin về học sinh, chúng ta có thể lấy được đầy đủ lí lịch của họ mà không cần thực hiện thêm bất kỳ truy vấn nào khác.

Mô hình nhúng một - nhiều

Khi có mối quan hệ một – nhiều và nhu cầu truy vấn cả hai đối tượng cùng lúc tăng cao, chúng ta có thể nhúng đối tượng phía quan hệ nhiều vào đối tượng phía quan hệ ít Tập hợp các đối tượng được nhúng sẽ trở thành một mảng và được thể hiện như một thuộc tính trong đối tượng bị nhúng.

Ví dụ ta có mối quan hệ cha con nhƣ sau:

Sử dụng ánh xạ lan truyền id trong mô hình quan hệ, biểu diễn bằng Documents trong MongoDB nhƣ sau:

Đối tượng con tham chiếu đến đối tượng cha qua khóa “Cha id” Khi đối tượng cha thường xuyên được truy xuất cùng với thông tin của đối tượng con, việc thực hiện 2 truy vấn sẽ không hiệu quả Để tối ưu hóa quá trình này và tránh truy vấn nhiều lần, chúng ta nên nhúng đối tượng con vào đối tượng cha.

Các đối tượng con được biểu diễn dưới dạng mảng và khi nhúng vào đối tượng cha, chúng trở thành thuộc tính "Con" của đối tượng cha Với mô hình này, thông tin từ cả hai đối tượng "cha" và "con" có thể được truy vấn chỉ bằng một câu lệnh Cách truy vấn giá trị dưới dạng mảng đã được mô tả trong mục 3.2.

Mô hình tham chiếu một – nhiều

Trong các mối quan hệ một nhiều, nếu không cần nhúng các đối tượng với nhau, MongoDB cung cấp phương pháp tham chiếu một – nhiều Thay vì nhúng toàn bộ đối tượng, phương pháp này chỉ nhúng khóa id của đối tượng để thực hiện tham chiếu, mang lại sự linh hoạt trong việc quản lý dữ liệu.

Ví dụ ta có mối quan hệ một - nhiều, một quê quán có nhiều người:

Sử dụng ánh xạ lan truyền id trong mô hình quan hệ, biểu diễn bằng Documents trong MongoDB nhƣ sau:

Khi số lượng đối tượng "Nguoi" rất lớn và cần thống kê số lượng người cùng quê quán, việc quét toàn bộ dữ liệu trong collection "Nguoi" sẽ tiêu tốn nhiều tài nguyên Để giải quyết vấn đề này, chúng ta có thể áp dụng mô hình tham chiếu một – nhiều, trong đó chỉ nhúng các khóa của đối tượng người vào đối tượng quê quán, biến chúng thành thuộc tính của nó Cách biểu diễn này giúp tối ưu hóa quá trình truy xuất dữ liệu.

Để thống kê số lượng người có cùng quê quán, ta chỉ cần tính tổng số phần tử trong mảng “Nguoi” của đối tượng quê quán mà không cần duyệt toàn bộ đối tượng “Nguoi” Các giá trị trong mảng được phân tách bằng dấu “,” và được đặt trong cặp dấu “[]”.

Mô hình tham chiếu nhiều – nhiều

Trong cơ sở dữ liệu quan hệ, để thể hiện mối quan hệ nhiều-nhiều, chúng ta cần tạo một bảng mới với các khóa của các đối tượng làm thuộc tính Ngược lại, trong MongoDB, mối quan hệ nhiều-nhiều được thể hiện thông qua tham chiếu nhiều-nhiều, trong đó một mảng các khóa của đối tượng này trở thành thuộc tính trong đối tượng khác.

Trong cơ sở dữ liệu quan hệ, mối quan hệ giữa giáo viên và học sinh được thể hiện rõ ràng, khi một giáo viên có khả năng dạy nhiều học sinh, đồng thời một học sinh cũng có thể học từ nhiều giáo viên khác nhau.

Sử dụng ánh xạ lan truyền id trong mô hình quan hệ, biểu diễn bằng Documents trong MongoDB nhƣ sau:

Tuy nhiên trong MongoDB chúng ta không cần thiết phải tạo một collection

Trong hệ thống "DayHoc", mối quan hệ nhiều - nhiều được thực hiện bằng cách nhúng các khóa của đối tượng học sinh vào đối tượng giáo viên và ngược lại Cách biểu diễn mối quan hệ này trong MongoDB giúp quản lý dữ liệu hiệu quả và linh hoạt.

} Ở đây thuộc tính „GiaoVien_id‟ trong đối tượng học sinh lưu trữ toàn bộ các

Thuộc tính „GiaoVien_id‟ của giáo viên lưu trữ thông tin về học sinh mà giáo viên đang dạy, trong khi thuộc tính „HocSinh_id‟ chứa toàn bộ „_id‟ của học sinh đó Điều này cho phép chúng ta thiết lập mối quan hệ nhiều - nhiều giữa giáo viên và học sinh mà không cần tạo thêm một collection mới.

Lựa chọn nhúng hay tham chiếu khi xây dựng CSDL trong MongoDB ?

Một câu hỏi quan trọng trong thiết kế lược đồ Mongo là liệu một đối tượng có cần một collection riêng hay nên nhúng vào các đối tượng trong các collection khác Trong cơ sở dữ liệu quan hệ, mỗi tiểu mục có thể trở thành một bảng riêng biệt, nhưng trong Mongo, việc nhúng các đối tượng được khuyến cáo vì tính hiệu quả cao hơn.

Một số tiêu chí để lựa chọn nhúng hay tham chiếu:

- Các đối tượng “lớp thứ nhất” là các đối tượng ở mức cao nhất, có bộ sưu tập của riêng mình

- Các đối tượng miêu tả chi tiết các mục thường được nhúng

- Các đối tƣợng mà theo mô hình đối tƣợng có chứa quan hệ nói chung nên đƣợc nhúng

- Quan hệ nhiều – nhiều thường được tham chiếu

Các bộ sưu tập nhỏ với ít đối tượng có thể được lưu trữ an toàn như những bộ sưu tập riêng lẻ, nhờ vào khả năng lưu trữ nhanh chóng trên bộ nhớ của máy chủ ứng dụng.

- Các đối tƣợng nhúng khó khăn để tham chiếu hơn là các đối tƣợng mức cao

- Sẽ khó khăn hơn để có một cái nhìn mức hệ thống đối với các đối tƣợng nhúng

- Nếu dữ liệu được nhúng lớn, có thể đạt đến giới hạn kích thước của một đối tượng (16M)

- Nếu hiệu suất là quan trọng, hãy nhúng

Hệ thống Blog yêu cầu mỗi bài viết phải có bộ sưu tập riêng, trong khi tác giả cũng có thể sở hữu bộ sưu tập cá nhân hoặc chỉ cần một trường địa chỉ email trong bài viết Ngoài ra, phần bình luận sẽ được nhúng trực tiếp trong các bài viết.

Cài đặt và sử dụng MongoDB

3.13.1 Cài đặt Để sử dụng MongoDB, lên trang chủ của MongoDB và tải về: www.MongoDB.org Khi tải xong, giải nén file zip vừa tải về vào 1 thƣ mục nào đó trên ổ cứng, có thể là ổ C, D, Ví dụ: D:\MongoDB Tạo thư mục data để lưu trữ database

Command Prompt và đƣa trỏ về thƣ mục bin của MongoDB Chạy mongod để khởi động server:

Lệnh –dbpath D;\MongoDB\data dùng để truy xuất đến thư mục lưu trữ database của MongoDB

Và ta có kết quả nhƣ sau:

MongoDB server đã được khởi động thành công và hiện đang lắng nghe các kết nối đến cổng 27017 (cổng mặc định của MongoDB) và cổng 28017 (cổng dành cho quản trị web).

3.13.2 Khởi tạo và truy vấn Database

Về cơ bản, so sánh CSDL quan hệ với MongoDB nhƣ sau:

Thay vì sử dụng bảng và các tuple như trong các cơ sở dữ liệu quan hệ, MongoDB lưu trữ dữ liệu dưới dạng JSON, được gọi là BSON do lưu trữ dưới dạng nhị phân của một tài liệu JSON.

Chạy Command Prompt và đƣa trỏ về thƣ mục bin của MongoDB Gõ lệnh mongo tại cửa sổ Command Prompt.: >mongo

Khi kết nối thành công chúng ta đƣợc chuyển ngay tới 1 database mặc định là test Để khởi tạo database ta dùng lệnh:

Mặc dù chưa có cơ sở dữ liệu nào mang tên myDatabase, nhưng nhờ vào cơ chế tự động cấp phát, chúng ta sẽ nhận được quyền truy cập trước Khi có bất kỳ hành động nào liên quan đến việc tạo mới hoặc chỉnh sửa cơ sở dữ liệu, MongoDB sẽ tự động tạo ra các file cơ sở dữ liệu thực sự Hiện tại, bạn có thể kiểm tra thư mục data và sẽ thấy không có file nào mang tên myDatabase.

Khi bắt đầu thêm collection, database sẽ được tạo ra và lưu trữ trên ổ đĩa thông qua hai file có đuôi x (với x = 0,1,2,3 ) và ns.

- File „.x‟ là file chứa dữ liệu database có kích thước được định dạng sẵn và không đổi

Nó giúp giảm tình trạng phân mảnh tập tin, với các kích thước như „.0‟ là 64MB, „.1‟ là 128MB, và tiếp tục cho đến 2GB Khi đạt đến 2GB, các tập tin tiếp theo cũng sẽ có kích thước 2GB.

File ".ns" chứa nhiều không gian tên, với mỗi collection và chỉ số được tính là một không gian tên riêng biệt Điều này cho phép tạo tối đa 12.000 collections Để tăng số lượng này, có thể sử dụng tham số -nssize Kích thước tối đa cho một file ".ns" là 2GB.

- Xóa Database: dùng lệnh >db.dropDatabase() để xóa database hiện tại Để hiển thị các database ta dùng lệnh:

Trên màn hình Command Prompt ta dùng lệnh:

> db.createUser( user: “userName”, pwd: “password”, roles[

-userName: là tên tài khoản dùng để đăng nhập

-password: là mật khẩu để đăng nhập

-roles: một mảng danh sách các quyền hạn của user

-databaseName; tên databse đƣợc áp dụng cho tài khoản

Bảng tên một số quyền hạn:

Read Chỉ cho phép đọc readWrite Đƣợc phép đọc và ghi dbAdmin Quyền admin userAdmin Đƣợc phép làm việc với các user dbOwner Gồm readWrite, dbAdmin, userAdmin

Quyền hạn trên các cụm clusterManager clusterMonitor hostManager

Quyền hạn an toàn csdl

Backup Đƣợc phép backup dữ liệu

Restore Đƣợc phép remote dữ liệu

Quyền hạn trên toàn bộ database bao gồm: readAnyDatabase cho phép đọc tất cả các database, readWriteAnyDatabase cho phép nhập dữ liệu vào database, userAdminAnyDatabase để quản lý người dùng trên database, và dbAdminAnyDatabase có quyền quản trị đối với mọi database.

Sau khi khởi tạo tài khoản, để sử dụng ta phải khởi động lại server với thuộc tính bảo mật:

> mongod auth –dbpath D:\MongoDB\data

Muốn sử dụng MongoDB ta phải xác thực tài khoản:

Bây giờ ta có thể làm việc với MongoDB bằng các quyền hạn đã đƣợc cấp quan userName

Sau khi khởi tạo cơ sở dữ liệu, chúng ta thường nghĩ đến việc tạo bảng Tuy nhiên, trong NoSQL, không có khái niệm bảng mà chỉ có Collection, tương tự như Collection Framework trong Java Collection có nhiệm vụ lưu trữ và truy vấn dữ liệu, được phân chia thành các Documents, tương đương với tuples trong cơ sở dữ liệu quan hệ Document là đối tượng dạng JSON chứa các key và value, cho phép truy xuất giá trị dễ dàng thông qua các key Để tạo một Collection, ta sử dụng lệnh tương ứng.

Db là database hiện hành còn createCollection() là mã lệnh Tên collection phải đặt trong dấu “” hoặc „‟

Sau khi có Collection ta có thể làm việc với các dữ liệu bên trong nó

Capped Collection là một tập hợp có số lượng phần tử cố định, đảm bảo lưu trữ theo thứ tự tự nhiên mà không tự sắp xếp lại Khi số lượng phần tử đạt ngưỡng tối đa, phần tử cũ nhất sẽ bị xóa khi thêm phần tử mới Capped Collection rất phù hợp cho việc ghi log nhờ vào tốc độ nhanh và khả năng truy xuất dữ liệu theo thứ tự đã lưu mà không cần sắp xếp lại.

> db.createCollection("someCollection",{ capped: true, size:100000, max:100

}) size: là maximum size của capped collection tính bằng byte max: là số phần tử tối đa trong capped collection đó

- Xóa collection: để xóa collection ta dùng lệnh:

Trong đó collectionName là tên collection cần xóa

Tuy nhiên không nhất thiết phải sử dụng lệnh create để tạo một collection Nhờ cơ chế tự cấp phát của MongoDB bạn chỉ cần dùng lệnh

Lệnh `db.collectionName.insert({_id:1})` được sử dụng để thêm dữ liệu mới vào `collectionName` Nếu `collectionName` chưa tồn tại, MongoDB sẽ tự động tạo ra nó khi dữ liệu được thêm vào Do đó, không có lỗi xảy ra khi tên collection bị sai Để kiểm tra các collection hiện có trong cơ sở dữ liệu, chúng ta có thể sử dụng lệnh phù hợp.

Lệnh sẽ trả về các collections có trong database hiện hành

Nền tảng của NoSQL là Javascript, nên các câu lệnh bạn thấy đều là cú pháp Javascript

> db.collectionName.insert({keys: values}) db: là database hiện hành collectionName: là tên collection cần thêm dữ liệu

{keys/values}: là một document

Mặc dù không phải là RDBMS nhƣng MongoDB vẫn cung cấp các cơ chế để truy vấn dữ liệu Cụ thể nhƣ sau:

Phương thức find() tương đương với câu SELECT trong SQL, và tương đương với mệnh đề WHERE, còn tương ứng với danh sách các fields ta cần truy vấn

Ví dụ ta có một collection chứa các cuốn sách, mỗi phần tử gồm có tiêu đề và đánh giá của khán giả

> db.movies.insert({tieude:"Cánh Đồng Hoang", danhgia:9.2})

> db.movies.insert({tieude:"Tắt Đèn", rating:7.6})

> db.movies.insert({tieude:"Đôi Mắt", rating:7.8})

/*SELECT * FROM Sach WHERE tieude= 'Đôi Mắt'*/

> db.movies.find({title:"Đôi Mắt"})

"_id" : ObjectId("51556737c79ef506ca8fc47d"),

/*SELECT * FROM Sach WHERE danhgia>9*/

> db.movies.find({danhgia:{$gt:9}})

"_id" : ObjectId("515567f1c79ef506ca8fc47f"),

_id là một filed đƣợc MongoDB tự động sinh ra với kiểu dữ liệu là ObjectId

ObjectId là một giá trị BSON 12-byte đƣợc cấu thành từ:

3-byte counter, starting with a random value

Ngoài ra bạn cũng có thể đặt giá trị cho _id Nó phải là duy nhất và có kiểu Int

> db.collection.update(query, update, options)

{ upsert: , multi: , writeConcern:

- query là tiêu chí để cập nhật Cấu trúc query giống với document dùng cho phương thức find()

- update là các thay đổi để cập nhật dữ liệu mới

Khi sử dụng tính năng upsert, nếu bạn chọn giá trị true, hệ thống sẽ tạo mới một tài liệu nếu không tìm thấy tài liệu nào phù hợp Ngược lại, nếu chọn false, sẽ không có tài liệu nào được tạo ra nếu không tìm thấy tài liệu phù hợp Giá trị mặc định của tùy chọn này là false.

Nếu chọn giá trị "true" cho tùy chọn multi, hệ thống sẽ cập nhật tất cả các tài liệu được tìm thấy Ngược lại, nếu chọn "false", chỉ tài liệu đầu tiên được tìm thấy sẽ được cập nhật Giá trị mặc định của tùy chọn này là "false".

- writeConcern: xác thực khi cập nhật Cấu trúc: writeConcern : {w : 1, j : true}

Khi thực hiện cập nhật không sử dụng options thì MongoDB sẽ lấy giá trị mặc định của chúng

Chuyển những người trên 18 tuổi thành “Trưởng Thành”

Lưu ý: khi dùng „multi :true‟ thì phải sử dụng „$set : {}‟

-query là một tiêu chí để xác định các documents cần xóa Nếu muốn xóa tất cả documents thì để trống

Xóa toàn bộ hàng tồn kho:

Xóa toàn bộ “Thực Phẩm” tồn kho:

> db.hangtonkho.remove({loai : “Thực Phẩm”})

Nếu chỉ muốn xóa một bản ghi đầu tiên ta dùng:

> db.hangtonkho.remove({loai : “Thực Phẩm”},1)

Ngoài ra MongoDB còn cung cấp lệnh findAndModify() dùng để thực hiện các truy vấn trên theo một thứ tự nhất định.

Mối tương quan logic trong MongoDB

ORDER BY DESC sort({field : -1})

LIKE „Joe%‟ /^Joe/ age>33 AND agedb.HoaDon.find({"TongTien":{$gt:100000}})

- Đƣa ra tất cả hóa đơn của khách hàng có ID là „1‟

SQL Select HD.* from HoaDon HD Join ChiTietHoaDon CTHD on

HD.IdHoaDon = CTHD.IdHoaDon where IdKhachHang = 1

MongoDB >db.HoaDon.find({"IdKhachHang": 1},{})

- Tìm 10 người mua hàng nhiều nhất

SQL Select KH.IdKhachHang,KH.HoVaTen,SUM(HD.TongTien) from

KhachHang KH Join HoaDon HD on KH.IdKhachHang HD.IdKhachHang group by (KH.IdKhachHang,KH.HoVaTen) order by SUM(HD.TongTien) limit 10

MongoDB >var IdKH = db.HoaDon.aggregae([{

>db.KhachHang.find({"IdKhachhang" : {$in:IdKH}})

KẾT NỐI VỚI CƠ SỞ DỮ LIỆU MONGODB

Môi Trường NET

4.1.1 Chuẩn bị Để C# có thể giao tiếp và làm việc trên cơ sở dữ liệu MongoDB trước tiên phải cài đặt trình điều khiển MongoDB dành cho C#: MongoDB NET client Library Sau khi cài đặt ta thêm thƣ viện vào C#: using MongoDB.Bson; using MongoDB.Driver;

Sau khi đã chuẩn bị môi trường trên C# Tạo một project và làm việc với MongoDB

MongoServer client MongoServer.Create("MongoDB://userName:password@localhost:27017");

- userName: là tải khoản đăng nhập vào MongoDB

Kết nối đến server: var server = client.GetServer();

Tạo database, nếu đã tồn tại thì tự động ghép: var database = server.GetDatabase("QuanLyHocSinh");

Tạo collection, nếu đã tồn tại thì tự động ghép: var collection = database.GetCollection("sinhvien");

- là tên class đại diện cho document

- (sinhvien) là tên collection cần tạo

4.1.3 Class Document Để thao tác đƣợc với dữ liệu trong database ta phải tạo một class đại diện cho một document trong MongoDB

Cấu trúc của class: using MongoDB.Bson; using MongoDB.Driver; public class sinhvien

{ public ObjectId Id { get; set; } public string Name { get; set; }

Trong đó ObjectId là id của document, name là một trường trong document Có thể tạo thêm nhiều trường tùy vào dữ liệu

4.1.4 Xuất nhập cơ sở dữ liệu

- Insert Để insert ta dùng lệnh: collectionName.insert(class)

Ví dụ: var collection = database.GetCollection("sinhvien"); collection.insert(new sinhvien(new ObjectId(),”Nguyễn”)); hoặc collection.insert(new sinhvien(1,”Nguyễn”));

- Find Để tìm kiếm ta dùng lệnh: var collection = database.GetCollection("sinhvien"); var query = Query.EQ(t => t.name.Equals(“Nguyễn”));

// select * from sinhvien where name = N“Nguyễn” var data = collection.findOne(query);

// hiện thị tất cả dữ liệu

//select * from sinhvien var data = collection.find();

- Update Để update ta cần chỉ rõ document nào cần update rồi dùng lệnh: collectionName.save();

Ví dụ: var collection = database.GetCollection("sinhvien"); var query = Query.EQ(t => t.name.Equals(“Nguyễn”));

// select * from sinhvien where name = N“Nguyễn” var data = collection.findOne(query);

//cập nhật lại dữ liệu

- Delete Để xóa một document ta dùng lệnh sau collection.remove()

//xóa theo tên var query = Query.EQ(t => t.name.Equals(“Nguyễn”)); collection.remove(query);

Môi trường java

- Máy tính phải cài môi trường giả lập Java SE Development Kit từ trang chủ

- Dùng chương trình Eclipse IDE for Java EE Developers dùng để lập trình

- Sử dụng server TomCat Apache để chạy Web Application

- Thêm server Tomcat Apache vào Eclipse: Từ giao diện chính của Eclipse chọn

To set up a new server in your development environment, navigate to Windown -> Show View -> Servers Right-click in the Servers tab and select New -> Server In the New Server dialog, choose Apache -> TomcatX and click Next Select the desired web applications and then click Finish to complete the setup By default, the Tomcat server runs on port 8080.

To create a new project in Eclipse, navigate to the main interface and select File -> New -> Other In the Select a wizard tab, locate the Web category and choose Dynamic Web Project, then click Next Enter the name of your Web Project and select the appropriate server in the Target section.

Runtime chọn Finish để kết thúc Để làm việc với MongoDB trong môi trường java ta cần sử dụng thư viện:

To integrate the MongoDB Java library into your project, start by creating a new project and then add the MongoDB library Use the import statement `import com.MongoDB.*` to include the library in your code To add the library to your project, right-click on the project, select Properties, then navigate to Java Build Path In the Libraries tab, click on Add External JARs, and a dialog will appear for you to select the library file After choosing the file, click Open and then Ok to complete the process.

4.2.2 Kết nối đến server Để kết nối đến server ta dùng các lệnh sau:

MongoClientURI("MongoDB://userName:myPassword@localhost:27017/myData"); //kết nối đến server

MongoClient client = new MongoClient(uri);

DB db = client.getDB(uri.getDatabase());

DBCollection myCollection = db.getCollection("quyen");

- userName : là tài khoản đăng nhập

- myData là tên database cần kết nối

4.2.3 Xuất nhập cơ sở dữ liệu

- BasicObject: là một lớp đại diện cho document trong Java

Cấu trúc của nó giống với document

Tạo một document cho collection sinhvien:

BasicObject sinhvien = new BasicObject(); sinhvien.append(“ id”,1); sinhvien.append(“name”, “quyen”);

- Insert Để thêm doccument vào database ta dùng cấu trúc lệnh sau:

Ví dụ: Thêm sinh viên mới có _id= 1 và tên là „quyen‟

DBCollection myCollection = db.getCollection("quyen");

BasicObject sinhvien = new BasicObject(); sinhvien.append(“ id”,1); sinhvien.append(“name”, “quyen”); myCollection.insert(sinhvien);

- Update Để update ta dùng lệnh: myCollection.update()

Ví dụ: cập nhật tên sinh viên thành „binh‟

DBCollection myCollection = db.getCollection("quyen");

BasicObject sinhvien = new BasicObject(); sinhvien.append(“ id”,1); sinhvien.append(“name”, “quyen”);

BasicObject sinhvienUpdate = new BasicObject(); sinhvien.append(“name”, “binh”); mycollection.update(sinhvien,sinhvienUpdate);

Cấu trúc lệnh: myCollection.remove();

Ví dụ: Xóa sinh viên có _id = 1

BasicObject sinhvien = new BasicObject(); sinhvien.append(“ id”,1); myCollection.remove(sinhvien)

4.2.4 Mô hình lập trình MVC

Kiến trúc mô hình MVC

- Model: Đây là thành phần chứa các nghiệp vụ logic, phương thức xử lý, truy xuất database, đối tƣợng mô tả dữ liệu nhƣ các class, hàm xử lý

View là phần đảm nhận việc hiển thị thông tin và tương tác với người dùng, bao gồm tất cả các đối tượng hiển thị trên giao diện như textbox, hình ảnh, và các thành phần HTML khác Nói một cách đơn giản, View là tập hợp các form và các thành phần HTML cần thiết để tạo ra trải nghiệm người dùng.

Controller đóng vai trò quan trọng trong việc tiếp nhận và điều hướng các yêu cầu từ người dùng, đồng thời gọi đúng các phương thức để xử lý chúng Chẳng hạn, controller sẽ nhận request từ URL và form để thực hiện các thao tác trực tiếp với Model.

Mô hình MVC trong ứng dụng WEB

3: Establish bean state, then place in session or request object

Biếu đồ cộng tác trong mô hình MVC

Khi người dùng tương tác với View để gửi yêu cầu, controller sẽ tiếp nhận và chuyển hướng yêu cầu đến các phương thức xử lý trong Model Sau khi Model hoàn tất quá trình xử lý, View sẽ hiển thị kết quả cho người dùng.

Phát triển phần mềm mang lại nhiều ưu điểm nổi bật, bao gồm tính chuyên nghiệp cao, khả năng làm việc nhóm hiệu quả và phân chia công việc hợp lý Quá trình này không chỉ giúp phát triển ứng dụng nhanh chóng mà còn dễ dàng nâng cấp khi cần thiết.

- Nhƣợc điểm: Với những dự án nhỏ MVC tạo ra sự cồng kềnh, tốn thời gian phát triển, tốc độ chậm do phải trung chuyển dữ liệu nhiều

4.2.5 Công cụ lập trình: Eclipse

Eclipse là phần mềm miễn phí được phát triển cho các ứng dụng J2EE, cho phép nhà phát triển tích hợp nhiều công cụ mà không cần sử dụng phần mềm riêng biệt Eclipse SDK bao gồm ba phần chính: Platform, Java Development Toolkit (JDT) và Plug-in Development Environment (PDE).

Eclipse được xem là một môi trường phát triển Java mạnh mẽ với sự hỗ trợ của JDT PDE giúp mở rộng Eclipse bằng cách tích hợp các plug-in vào nền tảng Eclipse, cung cấp dịch vụ cần thiết cho việc tích hợp công cụ phát triển phần mềm JDT có thể coi là một bộ plug-in, biến Eclipse thành một IDE cho Java.

MỘT SỐ THỬ NGHIỆM VỚI MONGODB

Thảo luận về hiệu năng của MongoDB và MS SQL Server 2008

NoSQL, đặc biệt là MongoDB, đã được cải tiến để hoạt động nhanh hơn so với các cơ sở dữ liệu quan hệ truyền thống Tuy nhiên, để xác thực điều này, chúng ta cần tiến hành thử nghiệm so sánh tốc độ giữa MongoDB và các hệ thống khác.

Tất cả các thử nghiệm được thực hiện trên laptop DELL INSPIRON N5110, sử dụng hệ điều hành Windows 7 64 bit, với bộ vi xử lý 2.20GHz, cùng phiên bản 64 bit của MS SQL Server 2008 Express và MongoDB 2.6.5.

Sử dụng cơ sở dữ liệu cho các ứng dụng trực tuyến giúp hỗ trợ tối đa số lượng người dùng truy cập Nhiều người sẽ sử dụng trang web và các ứng dụng khác nhau để tương tác với cơ sở dữ liệu Về mặt kỹ thuật, người dùng thực hiện các câu lệnh truy vấn, mỗi thao tác tương ứng với từng mảnh dữ liệu nhỏ trong toàn bộ hệ thống.

Mô hình dữ liệu thử nghiệm:

Quá trình thử nghiệm bao gồm các câu truy vấn insert, select và delete, trong đó trường ID ở cả hai cơ sở dữ liệu được tự động thêm vào Trường "TheData" chứa chuỗi ký tự dài 1000 chữ, được sinh ra ngẫu nhiên bằng cách lấy các số từ 1 đến.

255 rồi chuyển sang ký tự với bảng mã asscii Trường "TheTime" là thời gian hiện tại

Kết quả thử nghiệm trên máy tính cá nhân có thể thay đổi theo thời gian do sự khác nhau trong việc sử dụng tài nguyên Để nâng cao độ chính xác, chúng ta thực hiện 100 lần thử nghiệm và tính giá trị trung bình cùng độ lệch chuẩn Công thức tính giá trị trung bình và độ lệch chuẩn sẽ được áp dụng để so sánh kết quả.

Giá trị trung bình: Độ lệch chuẩn:

Quá trình thử nghiệm bao gồm việc thực hiện các thao tác insert, select và delete trên các tập dữ liệu với kích thước 100, 1000, 5000, 25.000, 50.000 và 100.000 bản ghi, đồng thời sử dụng 5 client truy cập đồng thời Ngôn ngữ lập trình C# được sử dụng để thực hiện các thao tác này, với giả định rằng thời gian biên dịch mã lệnh từ client đến cơ sở dữ liệu là giống nhau Để mô phỏng các client truy cập vào cơ sở dữ liệu, chúng tôi sử dụng Threads, và số lượng Thread tối đa có thể hoạt động phụ thuộc vào tài nguyên của máy tính.

Mô hình thuật toán kiểm tra thời gian của client:

5.2 Phương pháp đánh giá kết quả

Kết quả thử nghiệm trên máy tính cá nhân thường không đồng nhất do phụ thuộc vào thời gian và tài nguyên máy tính tại từng thời điểm Để nâng cao độ chính xác, cần thực hiện 100 lần thử nghiệm và tính toán giá trị trung bình cùng độ lệch chuẩn Độ lệch chuẩn nhỏ cho thấy sự biến thiên giữa các lần đo thấp, từ đó giá trị thu được sẽ chính xác hơn Công thức tính giá trị trung bình và độ lệch chuẩn được áp dụng để phân tích dữ liệu.

Giá trị trung bình Độ lệch chuẩn Giá trị trung bình Độ lệch huẩn

Bảng thống kê insert Đồ thị so sánh insert

Khi số lượng bản ghi được chèn vào dưới mức 1000, cả hai cơ sở dữ liệu có thời gian thực hiện tương đương nhau Tuy nhiên, khi số lượng bản ghi tăng lên tới 10.000, MongoDB cho thấy tốc độ chèn nhanh hơn từ 15 đến 20 lần so với cơ sở dữ liệu còn lại.

Giá trị trung bình Độ lệch chuẩn Giá trị trung bình Độ lệch chuẩn

Bảng thống kê Select Đồ thị so sánh select

Biểu đồ cho thấy khi chọn dưới 1.000 bản ghi, tốc độ của MS SQL nhanh gấp đôi so với MongoDB Tuy nhiên, khi số lượng bản ghi vượt quá 10.000, MongoDB lại thể hiện tốc độ vượt trội Đặc biệt, với hơn 100.000 bản ghi, MongoDB nhanh hơn MS SQL tới 12 lần Hơn nữa, tốc độ đọc của MongoDB rất ổn định khi số lượng bản ghi gia tăng.

Giá trị trung bình Độ lệch chuẩn Giá trị trung bình Độ lệch chuẩn

Bảng Thống Kê Insert Đồ thị so sánh quá trình Insert

Khi có 5 client cùng thực hiện thao tác insert vào cơ sở dữ liệu, MongoDB cho thấy hiệu suất vượt trội hơn hẳn, và sự chênh lệch này càng rõ rệt hơn khi số lượng bản ghi gia tăng.

Giá trị trung bình Độ lệch chuẩn Giá trị trung bình Độ lệch chuẩn

Bảng thống kê select Đồ thị so sánh select

Theo biểu đồ, khi số lượng bản ghi dưới 1000, MS SQL có tốc độ nhanh gấp đôi so với MongoDB Tuy nhiên, khi số lượng bản ghi vượt quá 10.000, MongoDB lại cho thấy hiệu suất vượt trội hơn Đặc biệt, với hơn 100.000 bản ghi, MongoDB nhanh hơn MS SQL tới 12 lần.

5.5 Thảo luận về hiệu năng của MongoDB và MS SQL Server 2008

Thử nghiệm thực tế cho thấy, với số lượng bản ghi nhỏ, MongoDB không cải thiện hiệu năng cơ sở dữ liệu một cách đáng kể Tuy nhiên, khi số lượng bản ghi tăng lên đến 50.000, MongoDB bắt đầu thể hiện ưu điểm về tốc độ xử lý Do đó, đối với các chương trình có dữ liệu nhỏ, nên sử dụng cơ sở dữ liệu quan hệ; còn với ứng dụng có lượng dữ liệu lớn và yêu cầu truy xuất cao, MongoDB sẽ nâng cao hiệu suất hoạt động của hệ thống một cách đáng kể.

Xây dựng BLOG với cơ sở dữ liệu lưu trữ MongoDB

Để đáp ứng nhu cầu trao đổi thông tin và thảo luận trên internet, website Blog trực tuyến đã ra đời, phục vụ cho đông đảo người dùng.

Trang web blog trực tuyến cho phép người dùng đăng tải nội dung và hình ảnh, đồng thời trao đổi và bình luận về các bài viết Để quản lý thông tin, một cơ sở dữ liệu được thiết lập nhằm theo dõi các thành viên tham gia blog Các thành viên có khả năng đăng bài viết về nhiều chủ đề khác nhau, cũng như đọc và bình luận lẫn nhau.

6.2 Người dùng và chức năng

Website có 2 người dùng: Người quản trị và Thành viên Các quyền được mô tả như sơ đồ chi tiết phân rã chức năng bên dưới

Use Case Khi Chƣa Đăng Nhập

Mô tả Cho phép người dùng đăng nhập vào hệ thống Điều kiện Người dùng đã đăng ký tài khoản

Sau khi người dùng nhập tên đăng nhập và mật khẩu vào form đăng nhập và nhấn “Login”, hệ thống sẽ mã hóa mật khẩu theo chuẩn MD5 Tiếp theo, hệ thống kiểm tra sự tồn tại của tên đăng nhập và mật khẩu trong cơ sở dữ liệu và thông báo kết quả cho người dùng.

Kết quả - Nếu đăng nhập thành công: hiển thị tên người dùng

- Thất bại: Yêu cầu nhập lại tên và mật khẩu

Ngoại lệ Nếu chƣa nhập thông tin tài khoản và mật khẩu thì yêu cầu nhập lại thông tin

Mô tả CaseUser đăng nhập

Mô tả Cho phép người dùng đăng ký một tài khoản của hệ thống Điều kiện

Sau khi đã nhập đầy đủ thông tin người dùng nhấn „Đăng Ký‟ hệ thống sẽ nhận thông tin và đăng ký tài khoản mới

Kết quả - Đăng ký thành công: Chuyển sang trang đăng nhập

- Thất bại: Yêu cầu nhập lại thông tin đăng ký

Ngoại lệ - Tên user đã có nguwoif sử dụng, yêu cầu nhập tên mới

Mô tả CaseUser đăng ký

Mô tả Hiển thị nội dung của một bài đăng (topic) và các bình luận của bài đăng này Điều kiện Biết đƣợc url của bài đăng

Hệ thống thu thập dữ liệu bài đăng và các bình luận từ cơ sở dữ liệu, sau đó xác minh quyền truy cập của người dùng đang đăng nhập.

- Nếu là member: cho phép đăng trả lời

- Nếu là manager/ owner: cho phép đăng và xoá trả lời

- Nếu người dùng chưa đăng nhập hoặc chưa tham gia nhóm: chi cho xem nội dung

Kết quả - Người dùng xem được nội dung của một bài đăng cùng với các bình luận

Ngoại lệ - Bài đăng đã bị xóa

Mô tả CaseUser Xem bài đăng

Mô tả Cho phép người dùng tìm kiếm thông tin Điều kiện

Sau khi người dùng nhập từ khóa và nhấn nút “Tìm kiếm”, hệ thống sẽ tiến hành tìm kiếm dựa trên tên (tìm kiếm gần đúng) và mô tả (description), sau đó hiển thị kết quả tìm kiếm.

Kết quả - Hiển thị các bài đăng có thông tin tương tự

Ngoại lệ - Không tìm thấy thông tin gì

Mô tả CaseUser Tìm Kiếm

Mô tả Cho phép người dùng đăng bình luận trong một bài đăng Điều kiện Người dùng phải đang đăng nhập

Sau khi người dùng gửi bình luận bằng cách nhấn “Bình Luận”, hệ thống sẽ lưu trữ bình luận vào cơ sở dữ liệu và tự động cập nhật giao diện web.

Kết quả Bình luận được lưu xuống cơ sở dữ liệu và giao diện được cập nhập mới lại

Luồng xử lý khác/ ngoại lệ

Khi người dùng chưa đăng nhập, việc đăng bình luận bị ngưng lại và một thông báo yêu cầu người dùng đăng nhập trước khi đăng bình luận

Mô tả Usecase đăng bình luận

Mô tả Tạo mới một bài đăng (topic) cho một group Điều kiện Người dùng cần đăng nhập vào hệ thống và đã tham gia group

Người dùng nhâp đầy đủ thông tin của topic vào form và nhấn

“Post”, hệ thống thực hiện lưu các thông tin sau xuống cơ sở dữ liệu: + Thông tin của Topic

+ Thêm thông tin của Topic mà người dùng vừa nhập vào nhóm Sau đó chuyển về trang chủ

Kết quả Trang chủ hiển thị tên của topic vừa mới tạo

Luồng xử lý khác/ ngoại lệ

Khi người dùng chưa tham gia nhóm, việc đăng topic bị ngưng lại và một thông báo yêu cầu người dùng tham gia vào nhóm trước khi đăng topic

Mô tả Usecase đăng topic

Mô tả Cho phép người có quyền “manager” và “owner” xoá các Topic Điều kiện Đã đăng nhập vào hệ thống với quyền “manager” hoặc “owner”

Để xóa một Topic, người dùng cần quay lại trang danh sách các Topic và đánh dấu vào các checkbox bên cạnh những Topic muốn xóa Sau khi chọn xong, người dùng có thể tiến hành xóa các Topic đã chọn.

“Delete” được hiển thị lên cho phép người dùng xoá các Topic đã chọn

Khi lệnh xoá Topic đƣợc thực hiện, các Topic đƣợc chọn sẽ đƣợc xoá lần lượt dưới cơ sở dữ liệu như sau:

+ Xoá Topic có ID tương ứng

Sau đó thông báo xoá thành công sẽ đƣợc hiển thị

Kết quả Xoá thành công các Topic đƣợc chọn Trên màn hình các nhóm đƣợc chọn bị mất đi

Luồng xử lý khác/ ngoại lệ

Mô tả Usecase xoá Topic

Biểu đồ trình tự của chức năng Đăng nhập

Biểu đồ trình tự của chức năng Đăng ký

Biểu đồ trình tự của chức năng Đăng bài

Biểu đồ trình tự của chức năng Xóa bài

Biểu đồ trình tự của chức năng Cập nhật bài viết

Biểu đồ trình tự của chức năng Bình luận

Biểu đồ trình tự của chức năng xóa Bình luận

STT T n màn hình Mô tả

1 Đăng Nhập Dùng để User đăng nhập vào hệ thống

2 Đăng Ký Dùng để đăng ký User

3 Home Danh sách các bài viết

4 Edit Thêm, sửa, xóa các bài viết

5 Blog Hiển thị các bài viết lên trang Blog

6 Bài Đăng Hiển thị bài đăng để User đọc và bình luận

Ngày đăng: 25/08/2021, 15:41

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w