Trong thời đại công nghệ số phát triển như hiện nay, dữ liệu ngày càng trở nên quan trọng. Các ứng dụng web và di động hiện đại thường cần lưu trữ và truy vấn một lượng lớn dữ liệu. Dữ liệu đóng vai trò là nền tảng của các ứng dụng web và di động hiện đại. Dữ liệu được sử dụng để lưu trữ thông tin về người dùng, sản phẩm, dịch vụ, và các khía cạnh khác của doanh nghiệp. Dữ liệu được sử dụng để cung cấp các tính năng và trải nghiệm cho người dùng. Dữ liệu được sử dụng để phân tích và ra quyết định. Từ đó các ứng dụng web và di động hiện tại thường cần luuw trữ và truy vấn một lượng lớn dữ liệu. Như một ứng dụng thương mại như Shopee cần lưu trữ những thông tin về sản phẩm, đơn hàng và người dùng hay một ứng dụng mạng xã hội cần lưu trữ thông tin về Người dùng bài đăng và bình luận , v… v. Thực trạng NoSQL ngày nay cho thấy sự phổ biến và đa dạng của các cơ sở dữ liệu NoSQL trong nhiều lĩnh vực khác nhau. Nhiều công ty lớn như Google, Amazon, Facebook, Twitter và Netflix đều sử dụng NoSQL để lưu trữ và xử lý dữ liệu của họ. Ngoài ra, NoSQL cũng được sử dụng trong các ứng dụng di động, Internet vạn vật, chơi game và web hiệu suất cao. NoSQL cũng hỗ trợ polyglot persistence, tức nhiều kiểu lưu trữ cho phép lưu trữ nhiều loại cơ sở dữ liệu NoSQL khác nhau tùy thuộc vào nhu cầu của các ứng dụng cụ thể. NoSQL DBMS là một lựa chọn tốt cho lưu trữ và truy vấn Big Data, nó có thể xử lý các tập dữ liệu lớn và phức tạp một cách hiệu quả. Với các ưu điểm như : Linh hoạt, tính mở rộng tốt, tính khả dụng cao,… Khiến nó ngày càng phổ biến trong việc lưu trữ và truy vấn BigData. Thực trạng NoSQL ngày nay cho thấy sự phổ biến và đa dạng của các cơ sở dữ liệu NoSQL trong nhiều lĩnh vực khác nhau. Nhiều công ty lớn như Google, Amazon, Facebook, Twitter và Netflix đều sử dụng NoSQL để lưu trữ và xử lý dữ liệu của họ. Ngoài ra, NoSQL cũng được sử dụng trong các ứng dụng di động, Internet vạn vật, chơi game và web hiệu suất cao. NoSQL cũng hỗ trợ polyglot persistence, tức nhiều kiểu lưu trữ cho phép lưu trữ nhiều loại cơ sở dữ liệu NoSQL khác nhau tùy thuộc vào nhu cầu của các ứng dụng cụ thể. MongoDB được biết đến như là một hệ quản trị cơ sở dữ liệu NoSQL tốt nhất hiện nay . Được xây dựng dựa trên mô hình tài liệu lưu trữ dữ liệu dưới dạng các tài liệu, là một cấu trúc dữ liệu giống như JSON được sử dụng phổ biến cho các ứng dụng web và di động hiện đại. Trong bài báo cáo này nhóm mình sẽ giới thiệu cũng như làm rõ về MongoDB, bao gốm các khái niệm, MongoDB hoạt động như thế nào ? Cách sử dụng MongoDB ,v..v
Tổng quan về BigData và NoSQL
BigData
Theo wikipedia: Dữ liệu lớn (Big data) là một thuật ngữ chỉ bộ dữ liệu lớn hoặc phức tạp mà các phương pháp truyền thống không đủ các ứng dụng để xử lý dữ liệu này
Theo Gartner: Dữ liệu lớn là những nguồn thông tin có đặc điểm chung khối lượng lớn, tốc độ nhanh và dữ liệu định dạng dưới nhiều hình thức khác nhau, do đó muốn khai thác được đòi hỏi phải có hình thức xử lý mới để đưa ra quyết định, khám phá và tối ưu hóa quy trình
- Volume (Khối lượng dữ liệu): Thu thập dữ liệu từ nhiều nguồn khác nhau, từ các giao dịch, thiết bị thông minh, thiết bị công nghiệp, video, hình ảnh, âm thanh, phương tiện truyền thông xã hội,
- Velocity (Vận tốc xử lý): Với sự phát triển của Internet of Things, tốc độ truyền dữ liệu vào các doanh nghiệp vô cùng nhanh và phải được xử lý kịp thời
- Variety (Dữ liệu đa dạng): Dữ liệu được thu thập ở nhiều định dạng khác nhau từ dữ liệu số, có cấu trúc trong cơ sở dữ liệu truyền thống đến tài liệu văn bản phi cấu trúc, email, video, âm thanh, dữ liệu mã chứng khoán và các giao dịch tài chính
+ Veracity (Độ chính xác): Vì đa dạng về các kiểu dữ liệu, nên sự không thống nhất của tập dữ liệu có thể cản trở các quy trình để xử lý và quản lý nó Do đó, độ chính xác của công nghệ này có thể đảm bảo giúp cho việc giảm bớt sự sai lệch đáng tiếc có thể xảy ra
+ Value (Mức độ giá trị của thông tin): Chất lượng dữ liệu của những dữ liệu lấy được có thể thay đổi rất nhiều, điều này sẽ ảnh hưởng rất mạnh đến việc phân tích chính xác những đấy
Ta có thể xem đây là tính chất cũng là khái niệm mà những doanh nghiệp hay nhà nghiên cứu muốn sử dụng và khai thác Big Data phải nắm giữ và am hiểu nó đầu tiên
+ Variability (Tính biến thiên của dữ liệu): Tính biến thiên của dữ liệu phản ánh sự không nhất quán trong dữ liệu, đặc biệt là trong xử lý ngôn ngữ tự nhiên, cùng một từ vựng nhưng trong các ngữ cảnh khác nhau nó sẽ mang các ý nghĩa khác nhau Tính biến thiên của dữ liệu cũng còn được thể hiện qua sự biến thiên về kích thước và tốc độ dữ liệu được sinh ra, do dữ liệu được thu thập từ nhiều nguồn khác nhau
Big Data đã hình thành từ thập niên 80-90 của thế kỉ XX
Năm 2005, sự ra đời của Hadoop và NoSQL đã đánh dấu một bước ngoặt quan trọng trong sự phát triển của Big Data Hadoop và NoSQL giúp cho việc lưu trữ và xử lý Big Data trở nên dễ dàng hơn và rẻ hơn Nhờ đó, Big Data đã trở nên phổ biến và được ứng dụng trong nhiều lĩnh vực khác nhau Đến đầu thế kỷ 21, sự phát triển của công nghệ như ổ cứng dung lượng lớn và các ngôn ngữ lập trình mới đã giúp cho việc lưu trữ và xử lý Big Data trở nên dễ dàng hơn
Hiện nay, nhờ có Internet of Things mà khối lượng Big Data ngày càng lớn với tốc độ nạp vô cùng nhanh chóng Lý do là vì dữ liệu ngày nay không chỉ do con người tạo ra mà còn do máy móc tạo tự động Big Data đã trở thành một tài nguyên quý giá đối với các doanh nghiệp, đặc biệt là các doanh nghiệp thương mại điện tử, giúp doanh nghiệp tăng lợi thế cạnh tranh và phục vụ khách hàng tốt hơn
Big Data là một tập dữ liệu có kích thước lớn, phức tạp và khó xử lý bằng các phương pháp truyền thống Big Data mang lại nhiều lợi ích to lớn cho doanh nghiệp, nhưng cũng có những thách thức cần được giải quyết
Các thách thức chính khi sử dụng Big Data bao gồm:
-Khối lượng dữ liệu lớn và tăng nhanh: Khối lượng dữ liệu được tạo ra mỗi ngày ngày càng lớn và tăng nhanh chóng Điều này gây ra khó khăn cho việc lưu trữ và xử lý dữ liệu
-Thời gian xử lý dữ liệu: Dữ liệu Big Data thường có cấu trúc phức tạp, đòi hỏi thời gian xử lý lâu
-Chất lượng dữ liệu: Dữ liệu Big Data thường có chất lượng không đồng nhất, có thể chứa nhiều dữ liệu lỗi Điều này gây khó khăn trong việc phân tích và khai thác dữ liệu
-Chi phí đầu tư: Đầu tư cho Big Data là một khoản chi phí lớn, đòi hỏi doanh nghiệp phải có nguồn lực tài chính dồi dào
-Kỹ năng và kiến thức: Không phải tất cả mọi người đều có đủ kỹ năng và kiến thức để sử dụng Big Data hiệu quả
-Quyền riêng tư: Việc sử dụng Big Data có thể gây xâm phạm quyền riêng tư của người dùng
-Chủ quan: Việc phụ thuộc quá nhiều vào dữ liệu từ Big Data có thể gây ra sự chủ quan trong phân tích và ra quyết định
5 Giải pháp cho các thách thức khi sử dụng Big Data
- Xây dựng hệ thống lưu trữ dữ liệu hiệu quả: Doanh nghiệp cần xây dựng hệ thống lưu trữ dữ liệu có khả năng mở rộng để đáp ứng nhu cầu lưu trữ ngày càng tăng của Big Data
NoSQL
NoSQL là một công nghệ cơ sở dữ liệu lưu trữ và truy xuất dữ liệu phi quan hệ (non- relational Data Management System) với sơ đồ linh hoạt
Vào năm 2009, Eric Evans, nhân viên của Rackspace giới thiệu lại thuật ngữ NoSQL khi
Johan Oskarsson của Last.fm muốn tổ chức một hội thảo về cơ sở dữ liệu nguồn mở phân tán Thuật ngữ NoSQL đánh dấu bước phát triển của thế hệ CSDL mới: một thế hệ CSDL không ràng buộc, phân tán, nguồn mở, khả năng mở rộng theo chiều ngang, có thể lưu trữ, xử lý từ một lượng rất nhỏ cho tới hàng petabytes dữ liệu trong hệ thống có độ chịu tải, chịu lỗi cao với những đòi hỏi về tài nguyên phần cứng thấp
3 So sánh SQL và NoSQL
Dữ liệu có cấu trúc và tổ chức
Sử dụng ngôn ngữ SQL để truy vấn dữ liệu
Dữ liệu và các mối quan hệ của nó được lưu trữ trong các bảng riêng biệt
NoSQL Không sử dụng SQL
Không khai báo ngôn ngữ truy vấn dữ liệu
Dữ liệu phi cấu trúc và không thể đoán trước Ưu tiên cho hiệu năng cao, tính sẵn sàng cao và khả năng mở rộng
4 Ưu điểm và nhược điểm a) Ưu điểm:
Những ưu điểm chính của nosql là khả năng mở rộng và tính sẵn sàng cao
-NoSQL giải quyết được các vấn đề dữ liệu lớn(big data) về các hệ thống thông tin hoặc là phân tán dữ liệu
-Việc mở rộng phạm vi là mềm dẻo: NoSQL thay thế câu thần chú cũ của các nhà quản trị CSDL về việc ‘mở rộng phạm vi’ với một thứ mới: ‘mở rộng ra ngoài’
Thay vì phải bổ sung thêm những máy chủ lớn hơn để tải nhiều dữ liệu hơn, thì CSDL NoSQL cho phép một công ty phân tán tải qua nhiều máy chủ khi tải gia tăng
-High availability: Khả năng tự động sao chép trong MongoDB làm cho nó rất tốt trong mọi trường hợp vì trong trường hợp có bất kỳ lỗi nào, dữ liệu sẽ tự động sao chép về trạng thái nhất quán trước đó b) Nhược điểm:
-Quản lý dữ liệu: Mục đích của các công cụ dữ liệu lớn là làm cho việc quản lý một lượng lớn dữ liệu trở nên đơn giản nhất Nhưng quản lý dữ liệu trong NoSQL phức tạp hơn nhiều so với cơ sở dữ liệu quan hệ Đặc biệt, NoSQL nổi tiếng là khó cài đặt và thậm chí là để quản lý nó hằng ngày cũng tốn khá nhiều thời gian
-Sao lưu dữ liệu: Sao lưu là một điểm yếu lớn đối với một số cơ sở dữ liệu NoSQL như MongoDB Nó không có cách tiếp cận để làm sao lưu dữ liệu một cách nhất quán
-Thiếu tính nhất quán: NoSQL đánh đổi sự nhất quán để ưu tiên tốc độ, hiệu suất hiệu quả hơn
-Trọng tâm hẹp: Cơ sở dữ liệu NoSQL có trọng tâm rất hẹp vì nó chủ yếu được thiết kế để lưu trữ nhưng nó cung cấp rất ít chức năng
-Mã nguồn mở: NoSQL là cơ sở dữ liệu mã nguồn mở và không có tiêu chuẩn đáng tin cậy cho NoSQL được nêu ra
-Không có lược đồ: Ngay cả khi bạn lấy dữ liệu ở dạng tự do, bạn hầu như luôn cần áp đặt các ràng buộc để làm cho nó hữu ích Với NoSQL, trách nhiệm sẽ được chuyển từ cơ sở dữ liệu sang nhà phát triển, lập trình ứng dụng
-Kỹ năng NoSQL: Một hạn chế khác đối với NoSQL là người sử dụng có thể sẽ thiếu các kỹ năng chuyên môn ở mức tương đối vì hệ thống này còn khá mới và không phải ai cũng biết sử dụng nó một cách thành thạo
- Wide Column Store / Column Families: Hadoop/HBase – Apache, BigTable – Google,
Cassandra - Facebook/Apache, Hypertable - Zvents Inc/Baidu, Cloudera, SciDB, Mnesia,
- Key-Value Store/Tuple store
- Key/value cache in RAM: memcached, Citrusleaf database, Velocity, Redis, Tuple space,
- Key/value save on disk: Memcachedb, Berkeley DB, Tokyo Cabinet, Redis,
- Eventually Consistent Key Value Store: Amazon Dynamo, Voldemort, Dynomite, KAI,
- dOrdered key-value store: NMDB, Memcachedb, Berkeley DB,
- Distributed systems: Apache River, MEMBASE, Azure Table Storage, Amazon Dynamo,
- Graph Database: Neo4J, Sones, AllegroGraph, Core Data, DEX, FlockDB, InfoGrid,
- Document Store: Apache Jackrabbit, CouchDB, IBM Lotus Notes Storage Format (NSF),
MongoDB, Terrastore, ThruDB, OrientDB, RavenDB,
MongoDB – Cơ sở dữ liệu NoSQL
Giới thiệu chung về MongoDB
1 Sự ra đời của MongoDB
MongoDB được bắt đầu phát triển vào đầu năm 2007 khi công ty 10gen đang phát triển một nền tảng tương tự dịch vụ Azure của Microsoft Công ty 10gen là một công ty phần mềm có trụ sở tại New York, nay được đổi tên thành MongoDB Inc Việc phát triển ban đầu tập trung vào xây dựng PaaS (một nền tảng dịch vụ) nhưng sau đó vào năm 2009, MongoDB đã xuất hiện trên thị trường như một dự án mã nguồn mở máy chủ cơ sở dữ liệu và được duy trì bởi chính tổ chức này.[6]
Tháng 3 năm 2010, MongoDB Inc đã tung ra sản phẩm sẵn sàng đầu tiên của mình là phiên bản 1.4 Phiên bản ổn định tiếp theo của MongoDB là phiên bản 2.4.9 được phát hành vào ngày 10 tháng 1 năm 2014 Đầu năm 2015, phiên bản 3.0 được phát hành, cuối năm 2015 phiên 3.2 ra đời đi kèm với công cụ quản trị trên giao diện đồ họa MongoDB Compass
2 Hệ cơ sở dữ liệu MongoDB
MongoDB là một hệ thống quản lý cơ sở dữ liệu (DBMS) phi quan hệ (NoSQL) phổ biến được phát triển bởi MongoDB, Inc Nó lưu trữ dữ liệu trong các tài liệu JSON được gọi là
(Binary JSON) và là một phần quan trọng của hệ sinh thái NoSQL cho các ứng dụng hiện đại
3 Cách MongoDB lưu trữ dữ liệu
MongoDB lưu trữ dữ liệu theo mô hình cơ sở dữ liệu NoSQL, có cấu trúc chủ yếu là JSON dưới dạng BSON (Binary JSON) Điều này cho phép MongoDB lưu trữ dữ liệu dưới dạng tài liệu, được gọi là "documents" Dữ liệu được tổ chức thành các bộ sưu tập ("collections"), mỗi bộ sưu tập có thể chứa nhiều tài liệu
- Database: MongoDB lưu trữ dữ liệu trong các cơ sở dữ liệu, mỗi cơ sở dữ liệu có thể chứa nhiều bộ sưu tập (collections)
- Collection: Đây là tập hợp các tài liệu, tương tự như bảng trong mô hình cơ sở dữ liệu quan hệ Mỗi bộ sưu tập có thể chứa nhiều tài liệu và không yêu cầu các tài liệu trong cùng một bộ sưu tập phải có cấu trúc dữ liệu giống nhau
- Document: Đây là một bản ghi dữ liệu JSON dưới dạng BSON, mô tả thông tin với các cặp key-value Các tài liệu trong một bộ sưu tập không cần phải có cấu trúc dữ liệu giống nhau
Tài liệu có thể chứa các trường khác nhau và không cần phải tuân theo schema cố định
- BSON( Binary JSON) : MongoDB sử dụng định dạng dữ liệu BSON (Binary JSON) để lưu trữ và truy xuất dữ liệu BSON là một định dạng dữ liệu nhị phân tương tự JSON, nhưng hỗ trợ thêm các kiểu dữ liệu và mã hóa dữ liệu để tối ưu việc lưu trữ và tìm kiếm
4 Thiết kế dữ liệu trong MongoDB
Khi thiết kế các schema cho một cơ sở dữ liệu quan hệ, chúng ta thường chia dữ liệu thành các bảng, sao cho không bị nhân đôi dữ liệu
Cùng nhìn ví dụ dưới đây, chúng ta có 3 bảng Users, Professions và Cars đại diện cho dữ liệu người dung
Dưới đây là ví dụ thiết kế cơ sở dữ liệu quan hệ (SQL)
Dữ liệu người dùng được chia thành những bảng riêng biệt, và chúng có thể được JOINED với nhau bằng cách sử dụng khóa ngoại trong cột user_id của bảng Professions và Cars
Bây giờ chúng ta cùng xem lại ví dụ trên như thế nào khi thiết kế theo MongoDB nhé !
Bạn có thể thấy, thay vì chia nhỏ dữ liệu thành từng collection, chúng ta tận dụng lợi thế của
MongoDB document có thể lưu trữ array và object bên trong User object Bây giờ chỉ với một query đơn giản, chúng ta có thể kéo tất cả dữ liệu về ứng dụng của chúng ta
MongoDB schema hoạt động khác với SQL Với kiểu thiết kế cơ sở dữ liệu theo MongoDB, chúng ta sẽ:
- Không có quy trình chính thức
- Không có những thuật toán
- Không có những quy tắc
Khi bạn thiết kế cơ sở dữ liệu bằng MongoDB, bạn chỉ cần quan tâm là thiết kế đó hoạt động tốt cho ứng dụng của bạn là được 2 App khác nhau, xử dụng data giống hệt nhau nhưng có thể nó sẽ có những schema khác nhau Đơn giản vì 2 app đó được sử dụng theo những cách khác nhau
Khi thiết kế cơ sở dữ liệu chúng ta nên quan tâm:
- Cung cấp hiệu suất tốt khi query
- Yêu cầu phần cứng hợp lý
5 Các tính năng của MongoDB a) Schema-less Database
Trong MongoDB, bạn được phép lưu trữ dữ liệu dưới dạng tài liệu (document) mà không cần yêu cầu sự định nghĩa trước về cấu trúc của chúng, giống như trong hệ thống quản lý cơ sở dữ liệu phi quan hệ (NoSQL)
Bạn có thể lưu trữ các tài liệu với các fields và giá trị (values) khác nhau mà không cần tuân theo một cấu trúc cố định Do đó, việc thêm, xóa hoặc sửa đổi các fields, giá trị của tài liệu được thực hiện một cách dễ dàng mà không cần phải thực hiện các bước định nghĩa cấu trúc cơ sở dữ liệu trước
Tính năng schema-less giúp tăng tính linh hoạt và giảm thời gian phát triển các ứng dụng, đặc biệt là đối với các ứng dụng có tính chất thay đổi dữ liệu thường xuyên hoặc không có một cấu trúc dữ liệu cố định
Tuy nhiên, tính năng này sẽ dẫn đến khó khăn trong việc truy vấn và xử lý dữ liệu nếu không có sự quản lý và thiết kế cẩn thận b) Document Oriented
Thao tác và cách sử dụng cùng MongoDB
Thay vì dùng câu SELECT như trong SQL , trong MongoDB sẽ sử dụng phương thức find() để truy vấn dữ liệu với các tham số cần truy vấn
+ find(): Khi không truyền vào tham số bên trong hàm find() thì nó sẽ lấy tất cả document có bên trong collection đó dưới dạng object nhưng không theo một cấu trúc nào cả
Dựa vào chức năng của hàm find() thì chúng ta có thể so sánh nó tương đương như câu lệnh
Cú pháp: db.collection_name.find()
Trong đó: collection_name là tên của collection muốn truy vấn
Và nếu muốn dữ liệu được trả về được hiển thị theo cấu trúc đã được định sẵn thì chỉ cần thêm hàm pretty() vào phía sau hàm find()
+ findOne(): Lấy ra một bản ghi duy nhất, trả về document đầu tiên b) Truy v ấn có điều kiện:
Cú pháp: db.collection_name.find(query, projection) Trong đó :
Collection_name : là tên collection của bạn query : không bắt buộc chỉ định những điều kiệu chúng ta muốn projection : không bắt buộc Chỉ định các trường để trả về trong các tài liệu khớp với query trên, nếu projection rỗng thì trả về tất cả các trường, có dạng
- value có thể là bất kì sau đây:
- 1 hoặc true để trả về trường đó 0 hoặc false để loại trường đó toán tử projection khác
Ví dụ: db.phongban.find({tenphg: 'Nghiên cứu'}, {maphg: 1});
WHERE tenphg LIKE “Nghiên cứu” db.diadiem_phg.find({}, {maphg: 0});
Lấy tất cả các trường ngoại trừ trường maphg đối với tất cả các văn bản
~ SQL: SELECT DIADIEM FROM DIADIEM_PHG ad.nhanvien.find({}, {honv: 1, tennv: 1, manv: 1});
Lấy một số trường trong nhanvien
~ SQL: SELECT HONV, TENNV, MANV
Lưu ý: Trường _id luôn luôn được trả về ngay cả khi không yêu cầu
+ Sắp xếp: Trả về các doccument trong collection được sắp xếp tăng dần tương ứng với
Cú pháp: db.collection_name.find().sort();
Ví dụ: db.nhanvien.find().sort({tennv: -1});
Trả về tất cả các văn bản mà trường tennv được sắp xếp theo thứ tự giảm dần
+ Giới hạn: Giới hạn số lượng document trong kết quả trả về
Cú pháp: db.collection_name.find().limit()
Ví dụ: db.nhanvien.find().limit(10)
Giới hạn kết quả trả về chỉ 10 nhân viên
+, Bỏ qua: Trả về kết quả bỏ qua các document trước vị trí đó
Cú pháp: db.collection_name.find().skip()
Ví dụ: db.nhanvien.find().skip(2)
Bỏ qua 2 nhân viên đầu tiên
FROM nhanvien SKIP 2 c) Truy v ấn bằng toán tử so sánh
Phép Toán Cú Pháp Ví dụ Câu lệnh tương ứng trong SQL
Bằng (Equality) {key: value} db.nhanvien.find({tennv: "Tiên"
Nhỏ hơn (Less Than ) {key: {$lt: value}} db.phancong.find({thoigian: { $lt:
Nhỏ hơn hoặc bằng (Less
{key: {$lte: value}} db.phancong.find({thoigian: { $lte:
Lơn hơn (Greater T han) {key: {$gt: value}} db.phancong.find({thoigian: { $gt:
{key: {$gte: value}} db.phancong.find({thoigian: { $gte:
Khác (Not Equals) {key: {$ne: value}} db.phancong.find({thoigian: { $ne:
[value1, value2, ]}} db.phancong.find({thoigian: { $in:
Không Thuộc (Not In) {key: {$nin:
[value1, value2, ]}} db.phancong.find({thoigian: { $nin:
Aggregate là một tính năng mạnh mẽ cho phép thực hiện các phép toán trên tập hợp dữ liệu và trả về kết quả xử lý tùy chỉnh Với Aggregate, bạn có thể thực hiện các phép toán như nhóm dữ liệu, sắp xếp, lọc và tính toán phức tạp trên cơ sở dữ liệu MongoDB
Những Document có thể được đưa qua một chuỗi các giai đoạn để biến đổi và kết quả nhận được sẽ là sự tổng hợp của các so sánh, sàng lọc, thêm bớt nội dung Mỗi giai biến đổi các
Document khi chúng đi qua, thậm chí là tạo ra loại Document khác hẳn ban đầu, kết quả bước trước làm đầu vào cho bước sau
Nhìn chung truy vấn bằng SQL có thể làm được những gì thì với Aggregate() của Mongodb cũng có thể làm được điều đó Thậm chí là khi nhìn vào truy vấn bạn còn dễ hình dung các bước xử lí và kết quả đầu ra hơn là thao tác với SQL
Dùng để lọc các Document, chỉ cho phép chuyển các Document phù hợp với tập điều kiện được chỉ định sang giai đoạn tiếp theo (nếu có)
Ví dụ: Với collection nhanvien như sau :
{ "_id" : ObjectId("512bc95fe835e68f199c8686"), "tennv" : "Tiên", “phai”: “Nam”}
Nếu muốn lấy ra những kết quả có giới tính là “Nam” ta sẽ làm như sau : db.nhanvien.aggregate(
$addFields: Thêm vào các trường dữ liệu
Ví dụ: Cũng với dữ liệu như trên, bây giờ mình lại muốn thêm vào kết quả một vài trường dữ liệu bằng $addFields db.nhanvien.aggregate([
Và thế là ta được:
{ "_id" : ObjectId("512bc95fe835e68f199c8686"), "tennv" : "Tiên", “phai”: “Nam”, “luong”:
{ "_id" : ObjectId("512bc962e835e68f199c8687"), "tennv" : "Hằng", “phai”: “Nữ”, “luong”:
{ "_id" : ObjectId("55f5a192d4bede9ac365b257"), "tennv" : "Vinh", “phai”: “Nam”,“luong”:
Có thể thấy sau khi thêm 2 trường luong, phg thì kết quả được kế thừa lại tới bước tiếp theo để cuối cùng ta được tổng hợp cả 4 trường
$group: để nhóm các tài liệu trong bộ sưu tập và thực hiện các phép toán trên nhóm đó
Ví dụ: Sử dụng kết quả ở trên chúng ta sử dụng hàm $group để nhóm các tài liệu trong bộ sưu tập theo giá trị của trường “phai” Sau đó, chúng ta sử dụng hàm $sum để tính tổng số lượng trong mỗi nhóm db.collection.aggregate([
{ $group: { _id: "$phai", count: { $sum: 1 } } } ]);
2 Cập nhật dữ liệu a) C ập nhật dữ liệu
+ Sửa đổi một bản ghi duy nhất – updateOne() Cú pháp: db.collectionName.updateOne( filter, update, { upsert:
Filter: tiêu chí lựa chọn bản ghi update update: trường được update và giá trị mới được update
Upsert (boolean): Nếu là true thì sẽ tạo document mới khi không tìm thấy document nào thỏa mãn filter và sẽ không có điều gì xảy ra nếu upsert = false Mặc định upsert = false
Lưu ý: Khi sử dụng phương thức updateOne() nếu như dữ liệu khớp với filter nhiều hơn một bản ghi thì nó sẽ chỉ sửa đổi cho bản ghi đầu tiên
~ SQL: UPDATE table_name tên quan hệ cần cập nhập
SET column1 = value1, column2 = value2, > Cột và giá trị cần cập nhật
Ví dụ: Các nhân viên có tên “Tiên” cập nhật phòng từ 5 thành 4 MongoDB : db.nhanvien.updateOne(
+ Sửa đổi nhiều bản ghi - updateMany()
Cú pháp: db.collectionName.updateMany( filter, update,
Phương thức này khác với phương thức updateOne() ở chỗ: Nếu như số lượng bản ghi so sánh khớp với filter lớn hơn 1 bản ghi thì nó sẽ sửa dữ liệu trên tất cả các bản ghi đó định được một dòng, nhiều dòng, không dòng nào hay toàn bộ các dòng sẽ cập nhật Nếu nhiều dòng được cập nhật trong một câu lệnh UPDATE thì dữ liệu cập nhật là giống nhau Ví dụ: Các nhân viên có phòng là 5 đều đổi thành 4 MongoDB: db.nhanvien.updateMany(
+ Sửa đổi bản ghi - update(): Ngoài 2 phương thức trên thì trong MongoDB còn cung cấp một phương thức update() có thể cấu hình updateOne() hoặc updateMany()
Cú pháp: db.collectionName.update( filter, update,
Multi: multi = true là cho phép sửa đổi nhiều bản ghi và ngược lại bằng false thì là không Mặc định multi = false
Ví dụ: Các nhân viên có phòng là 5 đều đổi thành 4 db.nhanvien.update(
+ Insert() db.conlectionName.insert(data)
Trong đó: data có thể là 1 object chứa các trường và giá trị của nó hoặc cũng có thẻ là một mảng đối tượng (nếu như bạn muốn thêm nhiều bản ghi trên một lần khai báo)
Thêm mới một dữ liệu vào collection có tên là nhanvien db.nhanvien.insert({ honv: “Phạm”, tenlot: “Văn”, tennv: "Vinh", luong: 30000, phg: 4
Thêm mới nhiều dữ liệu vào collection có tên là nhanvien db.nhanvien.insert([
{ honv: “Phạm”, tenlot: “Văn”, tennv: "Vinh", luong: 30000, phg: 4
{ honv: “Đinh”, tenlot: “Bá”, tennv: "Tiến", luong: 25000, phg: 1
+ InsertOne() db.collectionName.insertOne(data) Trong đó: data là một obejct chứa dữ liệu chúng ta cần thêm vào
Ví dụ: db.nhanvien.insertOne({ honv: “Phạm”, tenlot: “Văn”, tennv: "Vinh", luong: 30000, phg: 4
}) +InserMany() db.collectionName.insertMany(data)
Ví dụ: db.nhanvien.insertMany([
{ honv: “Phạm”, tenlot: “Văn”, tennv: "Vinh", luong: 30000, phg: 4
{ honv: “Đinh”, tenlot: “Bá”, tennv: "Tiến", luong: 25000, phg: 1
Tương tự như cập nhật dữ liệu, xóa dữ liệu trong MongoDB cũng có deleteOne() và deleteMany(), cách dùng cũng giống với updateOne() và updateMany()
+ deleteOne() db.collection.deleteOne( filter, options
Ví dụ: Xóa dữ liệu trong bộ sưu tập nhanvien có trường “tennv” là “Tiên” MongoDB: db.nhanvien.deleteOne({tennv: “Tiên”}); SQL:
+ deleteMany() db.collectionName.deleteMany( filter, options
Ví dụ: Xóa tất cả dữ liệu của nhân viên có lương > 38000 MongoDB: db.nhanvien.deleteMany({luong: { $gt: 38000 }}) SQL:
+, Ngoài ra, còn có lệnh xóa dữ liệu remove() có thể cấu hình thành deleteOne() hoặc deleteMany() Cú pháp: db.collectionName.remove( query,
Trong đó: query: Chứa các câu truy vấn để lọc dữ liệu justOne: Cấu hình số lượng bản ghi có thể xóa khi query thực thi khớp
Nếu justOne: true thì nó sẽ chỉ xóa 1 bản ghi duy nhất
Nếu justOne: false thì nó sẽ xóa tất cả các bản ghi khớp với điều kiện query
3 Chỉ mục và hiệu suất
Chỉ mục: là một cơ chế lưu trữ dữ liệu đặc biệt Khi tạo chỉ mục, MongoDB sẽ tạo ra một bảng tra cứu, giúp cho việc truy xuất dữ liệu nhanh hơn
Cú pháp: db.collection_name.createIndex({KEY: 1})
Trong đó: KEY là tên của trường muốn tạo chỉ mục
1 là thứ tự tăng dần và -1 là thứ tự giảm dần
Lưu ý: Việc thêm vào chỉ mục chỉ làm chậm quá trình ghi vào bộ sưu tập mà không làm chậm quá trình đọc Với những bộ sưu tập mà ghi nhiều hơn đọc, sử dụng chỉ mục là rất tốn kém
Các trường hợp nên lựa chọn chỉ mục:
Những trường mà theo đó các khóa được tìm kiếm nên được đánh chỉ mục
Những trường sắp xếp nói chung nên được đánh chỉ mục
Chỉ mục mặc định: Một chỉ mục luôn luôn được tạo ra là _id Chỉ mục này là đặc biệt và không thể bị xóa Chỉ mục _id là duy nhất cho các khóa của nó
Khóa nhúng: Có thể đánh chỉ mục trên các khóa bên trong văn bản nhúng
→ db.students.createIndex({"address.city": 1})
Mảng: Khi giá trị của trường được đánh chỉ mục của văn bản là một mảng MongoDB đánh chỉ mục mỗi phần tử của mảng đó
- Chỉ mục hỗn hợp các khóa
Chỉ mục hỗn hợp các khóa là một chỉ mục được tạo bằng việc kết hợp nhiều khóa trong một chỉ mục Chỉ mục này có thể được sử dụng để tìm kiếm các tài liệu theo nhiều tiêu chí khác nhau
Cú pháp: db.collection_name.createIndex({ "field1": 1, "field2": -1, })
Trong đó: field1 và field2 là các trường cần được tạo chỉ mục
1: sắp xếp theo thứ tự tăng dần
-1: sắp xếp theo thứ tự giảm dần
Lưu ý: Nếu chúng ta có một chỉ mục hỗn hợp trên nhiều trường, chúng ta có thể sử dụng nó để truy vấn trên các tập hợp con của các trường đó
Ứng dụng và đánh giá chung về MongoDB
MongoDB là một hệ quản trị cơ sở dữ liệu NoSQL mã nguồn mở dựa trên mô hình tài liệu MongoDB có thể được kết hợp với nhiều ngôn ngữ lập trình khác nhau, bao gồm:
• Java: Java là một ngôn ngữ lập trình hướng đối tượng phổ biến Việc kết hợp
MongoDB và Java mang lại một số lợi ích cho việc lập trình, bao gồm: o Dễ dàng: MongoDB và Java đều là các công nghệ mã nguồn mở, dễ học và sử dụng o Linh hoạt: MongoDB cho phép bạn lưu trữ dữ liệu dưới dạng các tài liệu JSON, giúp bạn linh hoạt hơn trong việc cấu trúc dữ liệu Java là một ngôn ngữ lập trình hướng đối tượng, giúp bạn viết các ứng dụng phức tạp hơn o Tính hiệu quả: MongoDB có thể truy cập dữ liệu nhanh chóng, nhờ sử dụng mô hình tài liệu và các chỉ mục Java là một ngôn ngữ lập trình hiệu quả, giúp bạn viết các ứng dụng có hiệu suất cao
• JavaScript : JavaScript là ngôn ngữ lập trình được sử dụng rộng rãi trong các ứng dụng web và di động Việc kết hợp MongoDB và JavaScript mang lại một số lợi ích cho việc lập trình, bao gồm:
O Nhanh chóng và dễ dàng: JavaScript là một ngôn ngữ lập trình nhẹ, có thể giúp bạn phát triển các ứng dụng nhanh chóng và dễ dàng o Tương thích với web: JavaScript là ngôn ngữ lập trình tiêu chuẩn cho web, giúp bạn dễ dàng tích hợp MongoDB vào các ứng dụng web o Tương thích với di động: JavaScript cũng là ngôn ngữ lập trình tiêu chuẩn cho di động, giúp bạn dễ dàng tích hợp MongoDB vào các ứng dụng di động
• Python : Python là một ngôn ngữ lập trình đa năng, được sử dụng rộng rãi trong nhiều lĩnh vực khác nhau, bao gồm khoa học dữ liệu, trí tuệ nhân tạo và phát triển web Việc kết hợp MongoDB và Python mang lại một số lợi ích cho việc lập trình, bao gồm: o Linh hoạt: Python là một ngôn ngữ lập trình linh hoạt, có thể giúp bạn viết các ứng dụng phức tạp hơn. o Dễ dàng học: Python là một ngôn ngữ lập trình dễ học, giúp bạn bắt đầu nhanh chóng
Ngoài ra, MongoDB cũng có thể được kết hợp với các ngôn ngữ lập trình khác, chẳng hạn như PHP, Ruby, Go, v.v.
Ví dụ ở đây là lập trình cùng Java :
Trong ví dụ này, chúng ta tạo một kết nối đến cơ sở dữ liệu MongoDB cục bộ, tạo một bộ sưu tập mới có tên "users", thêm một bản ghi vào bộ sưu tập "users", truy vấn tất cả các bản ghi trong bộ sưu tập "users", và hiển thị tên của bản ghi được trả về
Dưới đây là một số ví dụ cụ thể về việc kết hợp các ngôn ngữ lập trình cùng MongoDB:
• Ứng dụng mạng xã hội : MongoDB có thể được sử dụng để lưu trữ dữ liệu người dùng, bài đăng, bình luận, v.v Java, JavaScript hoặc Python có thể được sử dụng để xây dựng giao diện người dùng và xử lý các yêu cầu của người dùng
• Ứng dụng thương mại điện tử : MongoDB có thể được sử dụng để lưu trữ dữ liệu sản phẩm, đơn đặt hàng, thanh toán, v.v Java, JavaScript hoặc Python có thể được sử dụng để xây dựng trang web thương mại điện tử và xử lý các giao dịch mua bán
• Ứng dụng phân tích dữ liệu : MongoDB có thể được sử dụng để lưu trữ dữ liệu phân tích, chẳng hạn như dữ liệu từ các cảm biến, mạng xã hội, v.v Python có thể được sử dụng để xây dựng các ứng dụng phân tích dữ liệu và tạo báo cáo
2 Ưu và nhược điểm của MongoDB :
MongoDB cung cấp một số lợi ích cho việc lưu trữ và truy cập dữ liệu, bao gồm: a) Ưu điểm :
• Khả năng mở rộng: MongoDB có thể được mở rộng theo chiều ngang bằng cách thêm thêm các máy chủ Điều này giúp đáp ứng nhu cầu lưu trữ và truy cập dữ liệu ngày càng tăng của các ứng dụng
• Linh hoạt: MongoDB cho phép bạn lưu trữ dữ liệu dưới dạng các tài liệu JSON, giúp bạn linh hoạt hơn trong việc cấu trúc dữ liệu
• Tính hiệu quả: MongoDB có thể truy cập dữ liệu nhanh chóng, nhờ sử dụng mô hình tài liệu và các chỉ mục
• Dễ học và sử dụng: MongoDB có tài liệu tham khảo và cộng đồng hỗ trợ lớn, giúp bạn dễ dàng học và sử dụng b) Nhược điểm:
• Khả năng truy vấn phức tạp: MongoDB không hỗ trợ các truy vấn phức tạp như joins và subqueries
• Khả năng bảo mật: MongoDB không hỗ trợ các tính năng bảo mật mạnh mẽ như mã hóa dữ liệu
3 So sánh MongoDB và mySQL a) C ấu trúc dữ liệu :
MongoDB Lưu trữ dữ liệu dưới dạng các tài liệu JSON, có thể có cấu trúc đa hình và không
MySQL lưu trữ dữ liệu trong các bảng có cấu trúc cố định, phải tuân theo các ràng buộc và quy tắc của sơ đồ b) Hiệu suất
MongoDB Có thể truy vấn dữ liệu nhanh hơn SQL trong một số trường hợp, nhất là khi dữ liệu có cấu trúc phức tạp hoặc không đồng nhất( Làm 1 phép tính đơn giản thì MongoDB vẫn nhanh hơn SQL khoảng 30 – 50 lần )
SQL lại có thể xử lý các giao dịch phức tạp và thực hiện các thao tác toán học tốt hơn
MongoDB c) Kh ả năng mở rộng
MongoDB Có khả năng mở rộng ngang, tức là có thể phân tán dữ liệu trên nhiều máy để tăng khả năng chịu lỗi và cân bằng tải
MySQL Có khả năng mở rộng dọc, tức là có thể tăng dung lượng và hiệu năng của máy chủ để xử lý dữ liệu lớn d) Tính linh ho ạt :
MongoDB Có tính linh hoạt cao, cho phép thay đổi cấu trúc dữ liệu một cách dễ dàng và nhanh chóng
MySQL Có tính linh hoạt thấp, yêu cầu thực hiện các thay đổi sơ đồ một cách cẩn thận và có thể ảnh hưởng đến hiệu suất ứng dụng e) Tính năng hỗ trợ
Hỗ trợ các tính năng như indexing, replication, sharding, map-reduce, geospatial và aggregation framework
Hỗ trợ các tính năng như join, transaction, trigger, stored procedure và view
Khi nào bạn nên sử dụng MongoDB?
Bạn có thể sử dụng MongoDB trong các trường hợp sau:
- Sử dụng document để lưu trữ dữ liệu, dễ dàng thêm bớt, mở rộng dữ liệu tùy ý
- Ứng dụng có tính chất Insert nhiều (write-intensive)
- Cần cơ chế Replication và High Availability
Một số use case phổ biến của MongoDB là Hệ thống quản lý nội dung số, Các hệ thống phân tích dữ liệu lớn, Quản lý danh mục các sản phẩm trong thương mại điện tử, các ứng dụng social…
Khi nào bạn nên sử dụng MySQL?
MySQL là một giải pháp phù hợp cho các dự án cần đáp ứng các nhu cầu như:
- Các ứng dụng cần tính toán phức tạp và các câu truy vấn liên quan đến việc ghép nhiều bảng
- Các ứng dụng có yêu cầu cao về tính năng và khả năng mở rộng
- Các ứng dụng chủ yếu sử dụng ngôn ngữ SQL
- Các ứng dụng có quy mô nhỏ hoặc vừa
Một số các ứng dụng phù hợp với MySQL như các trang web thương mại điện tử, hệ thống quản lý khách hàng (CRM), các ứng dụng đọc tin tức hoặc hệ thống quản lý nội dung (CMS) và các ứng dụng quản lý dữ liệu nhỏ hoặc vừa