TỔNG QUAN VỀ MONGODB
Giới thiệu về MongoDB
NoSQL là một loại cơ sở dữ liệu mã nguồn mở không sử dụng Transact-SQL để truy vấn thông tin, viết tắt bởi None-Relational SQL hoặc Not-Only SQL Được phát triển trên Javascript Framework với kiểu dữ liệu JSON, NoSQL sử dụng cấu trúc dữ liệu kiểu key-value, mang lại hiệu năng nhanh và khả năng mở rộng linh hoạt mà không bị ràng buộc bởi các khóa chính hay khóa ngoại NoSQL ra đời nhằm khắc phục những hạn chế của mô hình dữ liệu quan hệ RDBMS về tốc độ, tính năng và khả năng mở rộng.
MongoDB là một hệ quản trị cơ sở dữ liệu mã nguồn mở, thuộc loại NoSQL, được hàng triệu người sử dụng Hệ thống này được phát triển bằng ngôn ngữ lập trình C++.
MongoDB là một cơ sở dữ liệu tài liệu, lưu trữ dữ liệu dưới dạng document kiểu JSON thay vì bảng như trong cơ sở dữ liệu quan hệ Điều này giúp tăng tốc độ truy vấn, mang lại hiệu suất cao, tính khả dụng tốt và khả năng mở rộng dễ dàng.
Trong cơ sở dữ liệu quan hệ, dữ liệu được lưu trữ trong các bảng, như MySQL hay SQL Server Ngược lại, MongoDB sử dụng khái niệm collection thay vì bảng để tổ chức và lưu trữ dữ liệu.
- So với RDBMS thì trong MongoDB collection ứng với table, còn document sẽ ứng với row, MongoDB sẽ sử dụng các document thay cho row trong RDBMS
- Các collection trong MongoDB được cấu trúc rất linh động, cho phép các dữ liệu lưu giữ không cần tuân theo một cấu trúc chắc chắn.
Kiến trúc của MongoDB
MongoDB được thiết kế để đáp ứng nhu cầu của các ứng dụng hiện đại với nền tảng công nghệ cho phép chúng ta:
• Mô hình hóa dữ liệu tài liệu: MongoDB đưa ra cho chúng ta cách tốt nhất để làm việc với dữ liệu
• Thiết kế hệ thống phân tán: cho phép chúng ta đưa dữ liệu vào nơi mình muốn một cách thông minh
Trải nghiệm thống nhất mang đến cho chúng ta tự do di chuyển ở mọi nơi, giúp chứng minh năng lực cá nhân trong tương lai và loại bỏ sự phụ thuộc vào nhà cung cấp.
Các thành phần trong MongoDB
A database serves as a container for collections, similar to how a relational database management system (RDBMS) contains tables Each database consists of a set of files within the file system.
Collection là một nhóm dữ liệu cùng loại do người dùng xác định, khác với table trong RDBMS ở chỗ collection không có ràng buộc hay quan hệ với các collection khác Mỗi dữ liệu trong collection có thể không cố định về số trường, khác với các row trong table.
Tài liệu (Document) là một dạng lưu trữ dữ liệu dưới định dạng JSON, tương đương với hàng (row) trong bảng (table) của hệ quản trị cơ sở dữ liệu quan hệ (RDBMS) Tuy nhiên, dữ liệu trong tài liệu rất linh hoạt, không bị giới hạn về số lượng trường (field), và dữ liệu trong mỗi trường có thể thay đổi linh hoạt.
Trường _id là một thành phần bắt buộc trong mỗi tài liệu của MongoDB, đại diện cho các giá trị duy nhất cho từng tài liệu Nếu không được thiết lập giá trị, MongoDB sẽ tự động tạo ra trường _id này.
Field là một cặp key-value, trong đó một document có thể không chứa trường nào hoặc có thể có nhiều trường Các trường này tương tự như các cột trong hệ quản trị cơ sở dữ liệu quan hệ (RDBMS).
In RDBMS, tables can be joined, such as linking a person table with an address table to identify the addresses associated with a person In contrast, MongoDB utilizes embedded documents, where a person's document includes an array of address documents, allowing for a more integrated data structure.
❖ So sánh hệ quản trị cơ sở dữ liệu quan hệ và MongoDB
Primary Key Primary Key (mặc định là _id)
Các tính năng nổi bật của MongoDB
Khi thiết kế lược đồ cơ sở dữ liệu, không thể dự đoán tất cả các truy vấn mà người dùng cuối sẽ thực hiện Truy vấn ad hoc là những lệnh tạm thời có giá trị phụ thuộc vào các biến cụ thể Mỗi lần thực thi truy vấn ad hoc, kết quả có thể khác nhau dựa trên các biến được sử dụng.
Tối ưu hóa xử lý truy vấn ad hoc là rất quan trọng, đặc biệt khi phải xem xét hàng triệu biến số MongoDB, với tính năng cơ sở dữ liệu tài liệu và lược đồ linh hoạt, nổi bật như một nền tảng đám mây lý tưởng cho các ứng dụng doanh nghiệp cần phân tích thời gian thực Hỗ trợ truy vấn ad hoc cho phép nhà phát triển cập nhật trong thời gian thực, từ đó cải thiện hiệu suất và tạo ra sự khác biệt lớn.
MongoDB hỗ trợ nhiều loại truy vấn, bao gồm truy vấn trường, truy vấn phạm vi và tìm kiếm bằng biểu thức chính quy Người dùng có thể truy xuất các trường cụ thể và sử dụng các chức năng tùy chỉnh Điều này khả thi nhờ vào việc MongoDB lập chỉ mục các tài liệu BSON và áp dụng ngôn ngữ truy vấn MongoDB (MQL).
Vấn đề chính mà nhiều nhóm hỗ trợ kỹ thuật gặp phải là lập chỉ mục, điều này rất quan trọng để cải thiện tốc độ và hiệu suất tìm kiếm Nếu không xác định đúng các chỉ mục thích hợp, sẽ dẫn đến nhiều vấn đề về khả năng truy cập, bao gồm cả khó khăn trong thực thi truy vấn và cân bằng tải.
Nếu không có chỉ mục phù hợp, cơ sở dữ liệu phải quét từng tài liệu để tìm kiếm thông tin liên quan đến câu lệnh truy vấn Tuy nhiên, với chỉ mục thích hợp, máy chủ có thể thực thi yêu cầu của người dùng một cách tối ưu MongoDB cung cấp nhiều loại chỉ số và tính năng hỗ trợ các mẫu truy cập phức tạp vào dữ liệu Đặc biệt, chỉ mục trong MongoDB có thể được tạo theo nhu cầu ứng dụng và thay đổi theo thời gian thực, cho phép khai báo trên bất kỳ trường nào trong tài liệu, kể cả các trường lồng trong mảng.
Khi dữ liệu chỉ lưu trữ trong một cơ sở dữ liệu duy nhất, bạn có thể gặp phải nhiều rủi ro như sự cố máy chủ, gián đoạn dịch vụ hoặc lỗi phần cứng Những sự kiện này có thể khiến việc truy cập dữ liệu trở nên khó khăn hoặc thậm chí không thể thực hiện được.
Nhân rộng giúp khắc phục lỗ hổng bằng cách triển khai nhiều máy chủ cho khôi phục và sao lưu sau thảm họa Mở rộng quy mô theo chiều ngang trên nhiều máy chủ với cùng một dữ liệu làm tăng tính khả dụng và ổn định của dữ liệu Đồng thời, việc sao chép dữ liệu cũng hỗ trợ cân bằng tải, giúp phân bổ đều tải giữa các máy chủ khi nhiều người dùng truy cập cùng lúc.
Trong MongoDB, các tập hợp bản sao cho phép một máy chủ chính tiếp nhận tất cả các hoạt động ghi và sao chép dữ liệu sang các máy chủ phụ Nếu máy chủ chính gặp sự cố, bất kỳ máy chủ phụ nào cũng có thể trở thành nút chính mới Khi máy chủ chính cũ quay lại trực tuyến, nó sẽ hoạt động như một máy chủ phụ cho nút chính mới.
Khi xử lý các tập dữ liệu lớn, sharding - quá trình phân tách dữ liệu thành các phân đoạn phân tán - giúp cơ sở dữ liệu thực hiện các truy vấn phức tạp hiệu quả hơn Nếu không có sharding, việc mở rộng ứng dụng web với hàng triệu người dùng sẽ rất khó khăn Sharding trong MongoDB cho phép khả năng mở rộng theo chiều ngang, với mỗi phân đoạn hoạt động như một cơ sở dữ liệu riêng biệt Các phân đoạn này tạo thành một cơ sở dữ liệu toàn diện, đáp ứng tốt hơn nhu cầu của ứng dụng mà không gặp thời gian chết Tất cả hoạt động trong môi trường sharding được quản lý qua quy trình nhẹ gọi là mongos, giúp định hướng truy vấn đến đúng phân đoạn dựa trên khóa phân đoạn và cải thiện khả năng cân bằng tải.
Cân bằng tải tối ưu là giải pháp hiệu quả cho việc quản lý cơ sở dữ liệu quy mô lớn trong các ứng dụng doanh nghiệp phát triển Phân phối hàng triệu yêu cầu của khách hàng đến hàng trăm hoặc hàng nghìn máy chủ một cách hợp lý sẽ mang lại sự cải thiện rõ rệt về hiệu suất.
MongoDB hỗ trợ cân bằng tải quy mô lớn thông qua các tính năng mở rộng quy mô ngang như sao chép và sharding Nền tảng này có khả năng xử lý nhiều yêu cầu đọc và ghi đồng thời với các giao thức khóa và kiểm soát đồng thời tốt nhất, đảm bảo tính nhất quán của dữ liệu Không cần bộ cân bằng tải bên ngoài, MongoDB mang đến cho người dùng chế độ xem nhất quán và trải nghiệm chất lượng khi truy cập dữ liệu.
Ưu, nhược điểm của MongoDB
• MongoDB là phần mềm mã nguồn mở miễn phí, có cộng đồng phát triển rất lớn
• Tốc độ truy vấn của MongoDB nhanh hơn hẳn so với các hệ quản trị cơ sở dữ liệu quan hệ
MongoDB lưu trữ dữ liệu dưới dạng Document JSON, cho phép mỗi collection có kích cỡ và cấu trúc document khác nhau Điều này mang lại tính linh hoạt cao trong việc quản lý dữ liệu, cho phép người dùng dễ dàng thêm dữ liệu theo nhu cầu mà không bị ràng buộc.
Dữ liệu trong MongoDB không có sự ràng buộc lẫn nhau và không hỗ trợ join như trong hệ quản trị cơ sở dữ liệu quan hệ (RDBMS) Điều này giúp quá trình chèn, xóa hoặc cập nhật dữ liệu diễn ra nhanh chóng hơn, vì không cần phải kiểm tra các ràng buộc dữ liệu như trong RDBMS.
MongoDB có khả năng mở rộng dễ dàng thông qua khái niệm cluster, là tập hợp các node chứa dữ liệu liên lạc với nhau Khi cần mở rộng hệ thống, người dùng chỉ cần thêm một node vào cluster để nâng cao hiệu suất và khả năng lưu trữ.
• Trường dữ liệu “_id” luôn được tự động đánh chỉ mục để tốc độ truy vấn nội dung đạt hiệu năng cao nhất
Khi một truy vấn dữ liệu được thực hiện, bản ghi sẽ được lưu trữ trong bộ nhớ RAM, giúp tăng tốc độ truy vấn cho các lần sau mà không cần truy cập vào ổ cứng.
Một trong những điểm mạnh của MongoDB cũng chính là nhược điểm của nó, đó là việc thiếu các thuộc tính ràng buộc như trong hệ quản trị cơ sở dữ liệu quan hệ (RDBMS) Điều này có thể dẫn đến việc dữ liệu dễ bị sai sót Vì vậy, khi làm việc với MongoDB, người dùng cần phải hết sức cẩn thận để đảm bảo tính chính xác của dữ liệu.
• Không hỗ trợ join giống như RDBMS nên khi viết function join trong code ta phải làm bằng tay khiến cho tốc độ truy vấn bị giảm
MongoDB tiêu tốn bộ nhớ do lưu trữ dữ liệu dưới dạng key-value, dẫn đến việc các collection có thể lặp lại key vì chỉ khác nhau ở value Hệ thống này không hỗ trợ join, dễ gây ra tình trạng dư thừa dữ liệu, trong khi trong RDBMS, chỉ cần lưu một bản ghi duy nhất và các bản ghi khác có thể tham chiếu đến nó.
Khi thực hiện các thao tác insert, update hoặc remove bản ghi, MongoDB không cập nhật ngay lập tức xuống ổ cứng Thay vào đó, sau 60 giây, MongoDB mới ghi toàn bộ dữ liệu thay đổi từ RAM xuống ổ cứng Điều này có thể gây ra rủi ro mất dữ liệu trong các tình huống như mất điện.
CÁC CƠ CHẾ BẢO MẬT CỦA MONGODB
Cơ chế xác thực trong MongoDB
Xác thực là quá trình xác minh danh tính người dùng, và khi kiểm soát truy cập được kích hoạt, MongoDB yêu cầu tất cả các máy khách thực hiện xác thực để xác định quyền truy cập của họ.
Xác thực và ủy quyền là hai khái niệm liên quan nhưng khác biệt Xác thực có nhiệm vụ xác minh danh tính của người dùng, trong khi ủy quyền xác định quyền truy cập và khả năng tương tác của người dùng trong các tài nguyên hạn chế.
Gồm 2 phương thức xác thực:
Để xác thực người dùng, cần cung cấp tên người dùng và mật khẩu đăng nhập, cùng với cơ sở dữ liệu xác thực liên quan đến người dùng đó.
⁃ Xác thực bằng cách sử dụng mongoshell:
+ Sử dụng các tùy chọn câu lệnh mongo xác thực ( username, password và authenticationDatabase) khi kết nối với mongob hoặc mongos
+ Kết nối với mongod hoặc mongos, sau đó chạy lệnh authenticate hoặc phương thức db.auth() dựa trên cơ sở dữ liệu xác thực
Xác thực nhiều lần với các vai trò khác nhau không làm mất thông tin đăng nhập của người dùng đã được xác thực trước đó Tuy nhiên, điều này có thể dẫn đến việc kết nối với nhiều quyền truy cập hơn mong muốn, gây ra lỗi trong các hoạt động của phiên logic.
Trước khi truy cập vào hệ thống MongoDB, người dùng cần xác thực danh tính của mình để đảm bảo an toàn dữ liệu Quy trình này ngăn chặn các ứng dụng không được phép truy cập vào thông tin được lưu trữ, bảo vệ dữ liệu khỏi những rủi ro không mong muốn.
MongoDB hỗ trợ hai cơ chế xác thực để người dùng xác minh danh tính của họ:
Ngoài ra, MongoDB Enterprise cũng cung cấp hỗ trợ xác thực LDAP proxy và xác thực Kerberos
Cơ chế xác thực thách thức – phản hồi có Salt (Salted Challenge Response Authentication Mechanism - SCRAM) là cơ chế xác thực mặc định cho MongoDB
SCRAM dựa trên tiêu chuẩn IETF RFC 5802 xác định các phương pháp tốt nhất để triển khai cơ chế này cho việc xác thực người dùng bằng mật khẩu
MongoDB áp dụng phương thức SCRAM để xác thực thông tin người dùng thông qua tên đăng nhập, mật khẩu và cơ sở dữ liệu xác thực Cơ sở dữ liệu xác thực là nơi người dùng được tạo ra cùng với tên đăng nhập, giúp đảm bảo quá trình xác minh người dùng diễn ra chính xác.
Việc triển khai SCRAM của MongoDB cung cấp:
• Khả năng hiệu chỉnh luồng dữ liệu
• Thêm ngẫu nhiên hàm Salt vào mỗi người dùng
• Xác thực máy chủ đối với máy client và ngược lại
MongoDB hỗ trợ 2 cơ chế SCRAM:
Cơ chế SCRAM Mô tả
SHA-1 - Sử dụng hàm băm SHA-1
- Thay đổi số lần lặp của mã SHA -1 SHA – 256 - Sử dụng hàm băm SHA – 256 ký tự và yêu cầu featureCompatibilityVersion set tới phiên bản 4.0
- Thay đổi số lần lặp của mã SHA 256
Để triển khai MongoDB trong phát triển phần mềm và sản xuất, cần có chứng chỉ hợp lệ được tạo và ký bởi tổ chức phát hành chứng thực số Người dùng hoặc tổ chức có thể lựa chọn tạo và duy trì chứng thực độc lập hoặc sử dụng chứng thực số từ các nhà cung cấp dịch vụ TLS/SSL bên thứ ba.
Chứng thực x.509 cho máy Client là một phương pháp xác thực với máy chủ, thay thế cho việc sử dụng tên người dùng và mật khẩu Để đảm bảo tính bảo mật, chứng thực số bên phía Client cần có các thuộc tính nhất định.
• Tổ chức phát hành chứng thực số (CA) phải cấp chứng chỉ xác thực cho cả máy client và máy chủ
The client certificate must include specific fields: keyUsage set to digitalSignature and extendedKeyUsage designated for clientAuth Each user is associated with a unique client certificate The X.509 Client object contains a distinguished name (DN) that differs from the Member object of X.509 Additionally, at least one of the attributes—Organization (O), Organizational Unit (OU), or Domain Component (DC)—in the client certificate must differ from the corresponding attributes in the net.tls.clusterFile and net.tls.certificateKeyFile on the server.
Nếu việc triển khai MongoDB đã được tlsX509ClusterAuthDNOverride set, thì đối tượng của chứng chỉ X.509 bên client cũng phải khác với giá trị đó
Để xác thực bằng chứng thư client trong cơ sở dữ liệu $external, cần thêm giá trị của subject chứng chỉ máy khách làm người dùng MongoDB Mỗi chứng thư client X.509 tương ứng với một người dùng MongoDB, do đó không thể sử dụng một chứng thư client để xác thực cho nhiều người dùng khác nhau Khi sử dụng phiên với người dùng xác thực trong $external (Kerberos, LDAP, X.509), tên người dùng không được vượt quá 10.000 bytes.
• Xác thực Để kết nối và xác thực bằng chứng chỉ client X.509:
+ Đối với MongoDB 4.2 trở lên, bao gồm các tùy chọn sau cho ứng dụng khách: tls
tlsCertificateKeyFilePassword nếu file khóa chứng thư được mã hóa authenticationDatabase '$external'
+ Đối với MongoDB 4.0 trở về trước, bao gồm các tùy chọn sau cho ứng dụng máy khách:
sslPEMKeyPassword nếu sslPEMKeyFile được mã hóa
Cơ chế ủy quyền trong mongoDB
MongoDB sử dụng cơ chế kiểm soát truy cập dựa trên vai trò (RBAC) để quản lý quyền truy cập vào hệ thống Người dùng được cấp một hoặc nhiều vai trò, xác định quyền truy cập vào các hoạt động liên quan đến tài nguyên cơ sở dữ liệu Chỉ những người dùng có vai trò phù hợp mới có quyền thực hiện các nhiệm vụ, trong khi những người không có vai trò sẽ không được phép truy cập vào hệ thống.
Role có thể bao gồm một hoặc nhiều role đã được xác định trước, cho phép kế thừa tất cả các đặc quyền từ các role khác trong cơ sở dữ liệu Thêm vào đó, role được tạo với quyền Admin trong cơ sở dữ liệu có khả năng kế thừa đặc quyền từ các role khác trong bất kỳ cơ sở dữ liệu nào.
Người dùng có thể kiểm tra các đặc quyền của một vai trò bằng cách sử dụng rolesInfo với các trường showPrivileges và showBuiltinRoles được thiết lập là true Điều này cho phép gán vai trò cần thiết cho người dùng trong quá trình tạo tài khoản hoặc cập nhật tài khoản hiện tại để gán hoặc thu hồi vai trò.
Người dùng trong MongoDB được gán một hoặc nhiều role, từ đó nhận được tất cả các đặc quyền tương ứng Việc gán role cho người dùng trong các cơ sở dữ liệu khác nhau cho phép họ thực thi quyền truy cập và thao tác trên nhiều cơ sở dữ liệu khác nhau.
2.2.3 Tính năng kiểm soát truy cập
MongoDB không kích hoạt tính năng kiểm soát truy cập mặc định khi bắt đầu sử dụng Người dùng có thể bật ủy quyền bằng cách thiết lập cài đặt auth hoặc security authorization Khi kích hoạt xác thực nội bộ, cơ chế ủy quyền bên phía client cũng sẽ được kích hoạt, yêu cầu người dùng phải tự xác thực sau khi bật kiểm soát truy cập.
Một role trong hệ thống cơ sở dữ liệu cung cấp các đặc quyền cho phép thực hiện các hành động cụ thể Mỗi đặc quyền có thể được xác định rõ trong role hoặc được kế thừa từ một role khác Các đặc quyền này liên quan đến các tài nguyên cụ thể, bao gồm cơ sở dữ liệu, set collection hoặc cluster Đặc biệt, nếu tài nguyên là cluster, các liên kết của nó sẽ ảnh hưởng nhiều hơn đến trạng thái tổng thể của hệ thống so với một cơ sở dữ liệu hoặc collection đơn lẻ.
Một role chỉ định quyền hoạt động được phép trên vùng tài nguyên
Khi kích hoạt kiểm soát truy cập, hãy chắc chắn rằng người dùng sở hữu vai trò userAdmin hoặc userAdminAnyDatabase trong cơ sở dữ liệu admin Người dùng với vai trò này có khả năng quản lý người dùng, bao gồm việc tạo người dùng mới, gán hoặc thu hồi vai trò từ người dùng hiện tại, cũng như tạo hoặc chỉnh sửa vai trò theo yêu cầu cấu hình của người dùng.
Bước 1: Khởi động MongoDB không có cơ chế kiểm soát truy cập mongod port 27017 dbpath /var/lib/mongodb
Bước 2: Kết nối với phiên bản MongoDB mongo port 27017
Bước 3: Tạo người dùng quyền admin use admin db.createUser(
{ user: "myUserAdmin", pwd: passwordPrompt(), // or cleartext password roles: [ { role: "userAdminAnyDatabase", db: "admin" },
Bước 4: Khởi động lại phiên bản MongoDB với cơ chế kiểm soát truy cập + Tắt mongod: db.adminCommand({ shutdown: 1 })
+ Khởi động mongod với tính năng kiểm soát truy cập mongod auth port 27017 dbpath /var/lib/mongodb
Bước 5: Kết nối và xác thực với quyền admin mongo port 27017 authenticationDatabase "admin" -u
Bước 6: Tạo thêm người dùng cho việc triển khai
After authenticating as an administrator user, you can create additional users using db.createUser () This allows users to assign built-in roles or define custom roles for new users.
+ Ví dụ: Thêm mới user myTester có quyền readWrite tới cơ sở dữ liệu test và quyền read trong cơ sở dữ liệu database use test db.createUser(
{ user: "myTester", pwd: passwordPrompt(), // or cleartext password roles: [ { role: "readWrite", db: "test" },
Bước 7: Kết nối tới phiên bản và xác thực với quyền người dùng đã được xác thực mongo port 27017 -u "myTester" authenticationDatabase "test" -p
Bước 8: Đưa vào file document vào trong cơ sở dữ liệu
+ Xác thực user myTester và đưa file document vào trong collection của database db.foo.insert( { x: 1, y: 1 } )
2.2.4 Quản lý người dùng và role
Quản lý người dùng và vai trò của người dùng trong MongoDB dựa trên mô hình ủy quyền yêu cầu bật kiểm soát truy cập Quá trình này đòi hỏi người dùng phải được xác thực với các đặc quyền cần thiết được chỉ định trong từng phần Người dùng có quyền admin với vai trò userAdminAnyDatabase hoặc userAdmin trong cơ sở dữ liệu sẽ có quyền hiển thị danh sách hoạt động của các đối tượng.
MongoDB cung cấp các vai trò để người dùng truy cập tài nguyên, cho phép quản trị viên kiểm soát quyền truy cập vào hệ thống Mặc dù có nhiều vai trò có sẵn, người dùng có thể tạo vai trò mới trong cơ sở dữ liệu nếu các vai trò hiện tại không đáp ứng yêu cầu quyền truy cập mong muốn.
Ngoại trừ các role trong cơ sở dữ liệu admin, mỗi role chỉ có thể chứa quyền áp dụng cho cơ sở dữ liệu của nó và kế thừa từ các role khác trong cùng cơ sở dữ liệu Các role trong cơ sở dữ liệu admin có thể bao gồm quyền cho cơ sở dữ liệu khác hoặc cho cluster, và có khả năng kế thừa từ mọi role trong các cơ sở dữ liệu khác Để tạo một role mới, sử dụng phương thức db.createRole() với quyền trong mảng privileges và các role kế thừa trong mảng roles MongoDB xác định một role duy nhất bằng cách kết hợp tên cơ sở dữ liệu và tên role Mỗi role được tạo ra trong phạm vi cơ sở dữ liệu cụ thể, nhưng thông tin của tất cả các role được lưu trữ trong admin.system.roles trong cơ sở dữ liệu admin.
• grantRole trên cơ sở dữ liệu để xác định quyền đối với role mới cũng như xác định role kế thừa nó
Các role userAdmin và userAdminAnyDatabase tích hợp createRole và grantRole trên các tương ứng tài nguyên
❖ Tạo role để quản lý hoạt động
Bước 1: Kết nối tới MongoDB với quyền hợp lý
+ Kết nối tới mongod hoặc mongos với quyền tương ứng
+ Quy trình sau myUserAdmin được tạo trong bật kiểm soát truy cập mongo port 27017 -u myUserAdmin -p 'abc123' authenticationDatabase 'admin'
Để quản lý hoạt động manageOpRole, bước đầu tiên là tạo một role mới với các quyền truy cập trên nhiều cơ sở dữ liệu và trên cluster Để thực hiện điều này, bạn cần phải có quyền admin trong cơ sở dữ liệu Sử dụng lệnh `use admin` và sau đó thực hiện `db.createRole(` để tạo role mới.
{ resource: { cluster: true }, actions: [ "killop",
Cơ chế mã hóa trong MongoDB
Cơ sở dữ liệu hoạt động dựa trên hai dạng dữ liệu chính: dữ liệu trạng thái nghỉ và dữ liệu trạng thái động Dữ liệu trạng thái động là luồng dữ liệu di chuyển qua mạng hoặc phần mềm, trong khi dữ liệu trạng thái tĩnh không di chuyển Cả hai loại dữ liệu này đều có nguy cơ bị can thiệp từ người dùng ẩn danh, do đó, MongoDB cung cấp giải pháp mã hóa để bảo vệ dữ liệu Quá trình mã hóa là một phần quan trọng trong việc đảm bảo an toàn cho dữ liệu.
• Tạo khóa master cho toàn bộ cơ sở dữ liệu
• Tạo các khóa riêng cho mỗi cơ sở dữ liệu
• Mã hóa dữ liệu của bạn bằng các khóa được tạo
• Mã hóa toàn bộ cơ sở dữ liệu bằng khóa master
2.3.1 Mã hóa dữ liệu trạng thái động
Dữ liệu giữa MongoDB và máy chủ ứng dụng được truyền tải qua hai giao thức bảo mật chính là Bảo mật lớp truyền tải (TLS) và Lớp cổng bảo mật (SSL) Hai giao thức này là những phương thức mã hóa phổ biến nhất, giúp bảo vệ dữ liệu khi gửi và nhận giữa các hệ thống Mục tiêu của việc này là mã hóa các kết nối đến các cá thể mongod và mongos, đảm bảo rằng chỉ có khách hàng hợp lệ mới có thể đọc được lưu lượng mạng.
TLS/SSL trong MongoDB sử dụng chứng thư số dạng tệp PEM, có thể được cấp bởi tổ chức phát hành chứng thư số hoặc tự ký Mặc dù kênh truyền được mã hóa, nhưng việc thiếu xác thực danh tính máy chủ có thể dẫn đến nguy cơ tấn công giữa đường truyền Do đó, việc sử dụng chứng thư từ cơ quan đáng tin cậy là cần thiết để đảm bảo các driver MongoDB có thể xác minh danh tính máy chủ một cách an toàn.
TLS/SSL không chỉ cung cấp mã hóa mà còn hỗ trợ xác thực máy khách và xác thực nội bộ cho các thành viên trong nhóm bản sao và cụm phân đoạn thông qua việc sử dụng các chứng chỉ.
❖ Cấu hình TLS/ SSL cho Client
Có nhiều cài đặt tùy chọn TLS / SSL khác nhau có thể được sử dụng trong cấu hình của các giao thức này
Ví dụ: Kết nối với phiên bản Mongod có sử dụng mã hóa: mongo ssl host hostname.example.com sslCAFile /etc/ssl/ca.pem
ssl: Cho phép kết nối TLS / SSL
Tùy chọn sslCAFile cho phép người dùng chỉ định tệp PEM của tổ chức phát hành chứng thư (CA) nhằm xác minh chứng thư do mongod hoặc mongos cung cấp Điều này giúp Mongo shell thực hiện việc xác minh chứng thư từ cá thể mongod dựa trên tệp CA đã chỉ định và tên máy chủ tương ứng.
Kết nối phiên bản MongoDB yêu cầu chứng thư từ ứng dụng client: mongo ssl host hostname.example.com sslPEMKeyFile /etc/ssl/client.pem sslCAFile /etc/ssl/ca.pem
sslPEMKeyFile: Chỉ định tệp pem có chứa chứng thư mongo shell và khóa để hiển thị cho mongod hoặc mongos Trong quá trình kết nối:
Mongo shell sẽ kiểm tra chứng chỉ để xác định xem nó có nguồn gốc từ cơ quan cấp chứng thư được chỉ định qua tham số sslCAFile hay không Nếu chứng chỉ không hợp lệ, shell sẽ tự động ngắt kết nối.
Shell sẽ kiểm tra tính khớp giữa tên máy chủ được chỉ định trong tùy chọn host với SAN hoặc CN trong chứng thư của mongod hoặc mongos Nếu tên máy chủ không khớp, kết nối sẽ không thành công.
Nếu không muốn sử dụng chứng thư tự ký, bạn phải đảm bảo mạng kết nối đáng tin cậy
Để bảo mật tốt hơn, cần giảm thiểu sự tiếp xúc của khóa bí mật, đặc biệt tại các khu vực liên quan đến replica sets và sharded cluster Việc này có thể thực hiện bằng cách sử dụng các chứng thư khác nhau trên từng máy chủ.
Supplementary options for connections include: requestSSL, which restricts each server to use only encrypted TLS/SSL connections; and sslAllowConnectionsWithoutCertificates, which permits authentication if the client presents a certificate; however, if no certificate is provided, the client can still connect in encrypted mode For example, the command can be executed as follows: mongod sslMode requireSSL sslAllowConnectionsWithoutCertificates sslPEMKeyFile /etc/ssl/mongodb.pem sslCAFile /etc/ssl/ca.pem.
The ` sslDisabledProtocols` option prevents the server from accepting connections that use specific protocols For instance, you can configure MongoDB to require SSL by using the command: `mongod sslMode requireSSL sslDisabledProtocols TLS1_0,TLS1_1 sslPEMKeyFile /etc/ssl/mongodb.pem sslCAFile /etc/ssl/ca.pem` This ensures enhanced security by disabling outdated TLS protocols.
2.3.2 Mã hóa dữ liệu ở trạng thái tĩnh
MongoDB sử dụng thuật toán mã hóa AES256-GCM, áp dụng cùng một khóa bí mật cho cả quá trình mã hóa và giải mã dữ liệu Chế độ FIPS có thể được kích hoạt để đảm bảo rằng việc mã hóa đáp ứng các tiêu chuẩn và yêu cầu tuân thủ cao nhất.
Toàn bộ tệp cơ sở dữ liệu được mã hóa bằng mã hóa dữ liệu trong suốt (TDE) ở tầng lưu trữ
Khi một tệp được mã hóa, một khóa mã hóa riêng sẽ được tạo ra, giúp việc quản lý và lưu trữ các khóa này trở nên dễ dàng Tất cả các khóa cơ sở dữ liệu được tạo ra sau đó sẽ được mã hóa bằng khóa master.
Khóa cơ sở dữ liệu và khóa master có sự khác biệt quan trọng; khóa cơ sở dữ liệu có thể được lưu trữ cùng với dữ liệu được mã hóa, trong khi khóa master nên được lưu trữ trên một máy chủ khác để đảm bảo an toàn cho dữ liệu.
Khi dữ liệu được sao chép, các tiêu chuẩn mã hóa không được chia sẻ giữa các nút do dữ liệu không được mã hóa hoàn toàn qua dây nối Mặc dù người dùng có thể tái sử dụng khóa cho các nút khác, nhưng nên sử dụng các khóa khác nhau cho từng nút tương ứng để đảm bảo an toàn.
Kiểm toán
Cơ sở kiểm toán giúp quản trị viên và người dùng theo dõi hoạt động của hệ thống khi triển khai với nhiều người dùng và ứng dụng, đồng thời cho phép ghi lại các sự kiện kiểm toán vào console, nhật ký hệ thống, tệp JSON hoặc tệp BSON.
Kiểm toán trong MongoDB không chỉ giúp phát hiện các cấu hình sai, lỗ hổng và lỗi đã biết mà còn cung cấp những lời khuyên hữu ích cho đội ngũ vận hành và phát triển MongoDB.
Sau khi được kích hoạt, hệ thống kiểm toán có thể ghi lại các hoạt động sau:
− Replica Set và cụm sharded
− Xác thực và trao quyền
Ngoài ra, cụ thể kiểm toán trong MongoDB sẽ kiểm tra các thông tin sau:
− MongoDB đang có trạng thái “listen” với port khác port mặc định:
Việc sử dụng port mongoDB mặc định khiến kẻ tấn công dễ dàng xác định vị trí và nhắm vào mục tiêu cụ thể
− Máy chủ chỉ accept kết nối đến các host và mạng trong danh sách:
MongoDB chỉ nên “listen” các kết nối đến có IP gốc thuộc về các ứng dụng hoặc hệ thống định sẵn, ứng với nghiệp vụ cụ thể
− MongoDB HTTP không nên truy cập được trên port 28017
Giao diện trạng thái HTTP của MongoDB nên bị vô hiệu hóa để ngăn việc lộ dữ liệu, rủi ro
− MongoDB không hiển thị phiên bản
Việc hiện thị phiên bản hiện tại của mongoDB sẽ giúp kẻ tấn công dễ dàng xác định được lỗ hổng của phiên bản hiện tại của hệ thống
− MongoDB phải đảm bảo đang sử dụng phiên bản mới nhất
Các phiên bản Mongo từ 2.4 trở về trước gặp nhiều vấn đề về bảo mật, vì vậy việc nâng cấp lên phiên bản mới nhất sẽ giúp tăng cường an toàn cho hệ thống.
− Mã hóa TLS/SSL đang được enabled
Mã hóa TLS/SSL các kết nối giữa máy chủ MongoDB và ứng dụng để tránh bị tấn công “man in the middle”
Ngoài ra, việc deploy mongoDB phải luôn sử dụng cert hợp lệ do tổ chức phát hành cert tạo
Yêu cầu tất cả các máy client muốn kết nối đến máy chủ mongoDB phải được xác thực
− Phương thức xác thực SCRAM-SHA-1 đang được enabled
SCRAM-SHA-1 an toàn hơn so với phương pháp xác thực MONGODB-CR trước đây, nhờ vào việc cung cấp salts ngẫu nhiên cho mỗi người dùng, sử dụng hàm băm mạnh hơn (SHA-1 thay vì MD5) và hỗ trợ xác thực 2 chiều.
− MongoDB server không được phép khởi chạy javascript
Việc thực hiện truy vấn trong JavaScript làm tăng cường sức mạnh cho MongoDB, nhưng cũng dễ bị tấn công thông qua việc inject vào file JavaScript hoặc tấn công từ chối dịch vụ (DOS) Do đó, JavaScript nên được tắt đi trừ khi ứng dụng thực sự cần sử dụng nó.
− Mỗi người dùng chỉ có quyền hạn với một database duy nhất
Mỗi người dùng chỉ nên có vai trò và quyền hạn đối với một DB duy nhất
Hệ thống kiểm toán của MongoDB ghi lại tất cả các sự kiện vào bộ đệm trong bộ nhớ và định kỳ ghi chúng vào đĩa Đối với các sự kiện từ một kết nối đơn lẻ, MongoDB đảm bảo rằng mọi sự kiện trước đó đã được ghi vào đĩa trước khi ghi sự kiện mới.
Khi một sự kiện kiểm toán liên quan đến hoạt động ảnh hưởng đến trạng thái lâu bền của cơ sở dữ liệu, như sửa đổi dữ liệu, MongoDB sẽ ghi sự kiện kiểm toán vào đĩa trước khi ghi vào nhật ký Điều này có nghĩa là trước khi thêm thao tác vào nhật ký, MongoDB sẽ viết tất cả các sự kiện kiểm toán trên kết nối đã kích hoạt hoạt động và bao gồm mục nhập cho hoạt động đó.
Các đảm bảo kiểm toán này yêu cầu MongoDB chạy với tính năng ghi nhật ký được bật.
QUẢN TRỊ CƠ SỞ DỮ LIỆU MONGODB
Tạo, xóa database
• Để tạo một database trong MongoDB ta sử dụng cú pháp: use databaseName
Trong đó: databaseName là tên của database muốn tạo
Lệnh "USE" được sử dụng để chỉ định cơ sở dữ liệu mà bạn muốn kết nối Nếu cơ sở dữ liệu được chỉ định chưa tồn tại, hệ thống sẽ tự động tạo một cơ sở dữ liệu mới với tên mà bạn đã cung cấp.
• Để xem tất cả các database đã được tạo trên MongoDB ta sử dụng cú pháp: show dbs hoặc show databases
Lệnh trên sẽ chỉ hiện ra các database đã có ít nhất một collection, còn nếu database nào chưa có thì nó sẽ không hiện
• Để xóa database trong MongoDB ta sử dụng cú pháp: db.dropDatabase()
Lệnh này được sử dụng để xóa cơ sở dữ liệu đang được sử dụng, vì vậy bạn cần phải kết nối với cơ sở dữ liệu muốn xóa để thực hiện thành công.
Tạo, xóa collections
Trong MongoDB, khái niệm mới về Collection đã thay thế các bảng (table) truyền thống trong các hệ quản trị cơ sở dữ liệu RDBMS trước đây để lưu trữ dữ liệu.
• Để tạo collection trong MongoDB ta sử dụng cú pháp: db.createCollection(collectionName, option)
⁃ collectionName là tên của collection mà bạn muốn tạo
Tùy chọn là một đối tượng chứa các tùy chọn cho collection, bao gồm: capped, xác định hành động khi collection vượt quá dung lượng cho phép; autoIndexId, cấu hình chỉ mục cho trường _id; size, kích cỡ tối đa của collection (đơn vị byte); max, số tài liệu tối đa cho một capped collection; validator, định dạng dữ liệu cho các trường; và validationLevel, xác định độ nghiêm ngặt của validator.
▪ "off" - không validator khi insert hoặc update
▪ "strict" - Đây là giá trị mặc định Thiết lập validator với mọi câu lệnh insert và update
"Moderate" là thiết lập validator cho các quy tắc đã được liệt kê; nếu trường nào không có, nó sẽ không được áp dụng Tham số validationAction xác định trạng thái khi dữ liệu không khớp với validator, với các giá trị có thể là "error" hoặc "warn" Ngoài ra, còn có các tùy chọn như indexOptionDefaults, viewOn, pipeline và collation.
Lưu ý: Để có thể thực hiện được lệnh createCollection này thì ta cần phải khai báo sử dụng database
• Để xóa một collection trong MongoDB ta sử dụng cú pháp: db.collectionName.drop()
• Để xem danh sách các collection đang có trong database ta sử dụng cú pháp: show collections
Insert document
MongoDB cung cấp cho chúng ta 3 phương thức để thực hiện việc thêm mới dữ liệu vào trong collection Bao gồm các phương thức sau:
Phương thức insert trong MongoDB dùng để thêm mới một hoặc nhiều dữ liệu vào trong MongoDB, cú pháp sử dụng: db.collectionName.insert(data)
• collectionName là tên của collection chúng ta cần thêm dữ liệu vào
Dữ liệu có thể được biểu diễn dưới dạng một đối tượng với các trường và giá trị của nó, hoặc cũng có thể là một mảng đối tượng, cho phép bạn thêm nhiều bản ghi trong một lần khai báo.
Phương thức insertOne trong MongoDB cho phép chèn một tài liệu vào cơ sở dữ liệu chỉ với một lần gọi Cú pháp sử dụng là: db.collectionName.insertOne(data).
• collectionName là tên của collection chúng ta cần thêm dữ liệu vào
• data là một obejct chứa dữ liệu chúng ta cần thêm vào
Phương thức insertMany cho phép chúng ta thêm mới nhiều dữ liệu vào trong MongoDB, cú pháp sử dụng: db.collectionName.insertMany(data)
• collectionName là tên của collection chúng ta cần thêm dữ liệu vào
• data là một mảng obejct chứa dữ liệu chúng ta cần thêm vào
Lưu ý rằng nếu collectionName chưa tồn tại trong hệ thống, MongoDB sẽ tự động tạo mới collection và chèn dữ liệu ngay lập tức.
Xóa document
Để xóa dữ liệu trong MongoDB thì ta sử dụng phương thức remove() với cú pháp: db.collectionName.remove(
{ justOne: , writeConcern: , collation:
• collectionName là tên của collection mà bạn muốn thực thi lệnh xóa document
• query là object (hay còn gọi là document) chứa các câu truy vấn để lọc dữ liệu
Tham số justOne trong cấu hình xác định số lượng bản ghi có thể xóa khi thực thi truy vấn Nếu justOne được đặt là true, hệ thống sẽ chỉ xóa một bản ghi duy nhất Ngược lại, nếu justOne là false, tất cả các bản ghi khớp với điều kiện truy vấn sẽ bị xóa.
• collation là một document chứa các quy tắc và không bắt buộc
Chú ý: Ngoài phương thức remove(), trong MongoDB còn có phương thức deleteOne() và deleteMany() để xóa một và xóa nhiều document theo bộ lọc.
Truy vấn dữ liệu
3.5.1 Lấy tất cả dữ liệu trong collection
• Để lấy tất cả dữ liệu ở trong collection chúng ta sử dụng phương thức find() với cú pháp: db.collectionName.find()
Trong đó, collectionName là tên của collection mà bạn muốn truy vấn Tuy nhiên, khi chỉ sử dụng phương thức find, dữ liệu trả về sẽ ở dạng object nhưng không theo cấu trúc nhất định nào.
• Để dữ liệu trả về được hiển thị theo cấu trúc đã được định sẵn thì ta sử dụng phương thức pretty() với cú pháp: db.collectionName.find().pretty()
3.5.2 Truy vấn có điều kiện Để truy vấn có điều kiện trong MongoDB thì ta cũng sử dụng cú pháp tương tự như lấy tất cả dữ liệu, nhưng lúc này chúng ta sẽ chèn thêm điều kiện vào trong hàm find() với cú pháp sau: db.collectionName.find(condition)
• collectionName là tên của collection mà bạn muốn truy vấn
• condition là object chứa mệnh đề điều kiện
Phép toán Cú pháp Ví dụ
Bằng (Equality) {key: value} db.admin.find({name:
"Tran Huong" }).pretty() Nhỏ hơn (Less Than ) {key: {$lt: value}} db.admin.find({age: {
$lt: 18}).pretty() Nhỏ hơn bằng (Less
{key: {$lte: value}} db.admin.find({age: {
$lte: 18}).pretty() Lớn hơn (Greater
{key: {$gt: value}} db.admin.find({age: {
$gt: 12}).pretty() Lớn hơn bằng
{key: {$gte: value}} db.admin.find({age: {
$gte: 12}).pretty() Khác (Not Equals) {key: {$ne: value}} db.admin.find({age: {
Trong (In) {key: {$in: [value1, value2, ]}} db.admin.find({age: {
$in: [12, 18]}).pretty() Không Thuộc (Not In) {key: {$nin: [value1, value2, ]}} db.admin.find({age: {
Chú ý: Ngoài phương thức find(), trong MongoDB còn có phương thức findOne() chỉ trả về một Document
3.5.3 Truy vấn nhiều điều kiện
Trong phương thức find() của MongoDB, khi bạn truyền nhiều khóa được phân tách bằng dấu phẩy, hệ thống sẽ hiểu đó là điều kiện AND Cú pháp cơ bản để sử dụng AND trong MongoDB là: db.collectionName.find({$and: [{key1: value1}, {key2: value2},…]}).
Để sử dụng mệnh đề $or trong MongoDB, bạn cần truyền một key có tên là $or, kèm theo mảng các điều kiện Cú pháp để thực hiện truy vấn này là: db.collectionName.find({$or: [{key1: value1}, {key2: value2}, ]}).
Để kết hợp cả AND và OR trong truy vấn, bạn chỉ cần áp dụng cách thực hiện truy vấn AND như bình thường, và đối với các truy vấn sử dụng OR, hãy xử lý chúng theo cách tương tự như truy vấn OR.
Lập chỉ mục
Trong MongoDB, việc sử dụng index giúp tối ưu hóa hiệu suất của các câu truy vấn Khi không có index, MongoDB phải duyệt qua toàn bộ các document trong một collection để tìm kiếm các document phù hợp với điều kiện truy vấn Tuy nhiên, khi có index, MongoDB có thể sử dụng nó để giảm thiểu số lượng document cần kiểm tra, từ đó tăng tốc độ truy vấn.
Index là cấu trúc đặc biệt dùng để lưu trữ một phần nhỏ của collection, giúp lưu giá trị của một hoặc nhiều trường được đánh chỉ mục và sắp xếp chúng theo giá trị của trường đó.
MongoDB sử dụng việc lưu trữ và sắp xếp index để nhanh chóng xác định khoảng cần tìm kiếm Nhờ vào các index này, hệ thống có thể nhanh chóng truy xuất đến các document được lưu trữ trong cơ sở dữ liệu MongoDB.
3.6.1 Các loại index trong MongoDB
MongoDB cung cấp một số loại index khác nhau để hỗ trợ cho các kiểu dữ liệu và câu truy vấn khác nhau
Index trên một field duy nhất Mặc định MongoDB lập single field index trên _id
Thứ tự sắp xếp index trong single field là không quan trọng vì MongoDB có thể đi từ 2 hướng đầu đến cuối và ngược lại
MongoDB hỗ trợ đánh index trên nhiều trường, và thứ tự của các trường trong index rất quan trọng Chẳng hạn, với compound index {name: 1, userid: -1}, MongoDB sẽ sắp xếp các bản ghi theo trường name trước, sau đó sẽ sắp xếp theo trường userid cho những bản ghi có cùng giá trị name.
MongoDB sử dụng chỉ mục đa khóa (multikey index) để lập chỉ mục cho các trường dữ liệu dạng mảng Khi bạn tạo chỉ mục trên một trường là mảng, MongoDB sẽ tự động tạo các chỉ mục riêng biệt cho từng phần tử trong mảng đó.
Multikey index cho phéo truy vấn chọn các tài liệu bằng cách khớp với một hoặc nhiều phần tử trong array
Lưu ý: Multikey index là tự MongoDB thiết lập khi bạn đánh index trên field có kiểu dữ liệu array Bạn không cần chỉ định bất cứ thứ gì
Text index giúp tìm kiếm nội dung kiểu dữ liệu string trong collection một cách hiệu quả Nó không lưu trữ các từ ngữ không mang ý nghĩa như “the”, “a”, “an”, mà chỉ ghi lại các từ gốc để tối ưu hóa quá trình tìm kiếm.
Unique index property đảm bảo bảo rằng sẽ không có giá trị trùng lặp trên các field được đánh chỉ mục unique
Sparse index chỉ lưu trữ các tài liệu có dữ liệu tại trường được lập chỉ mục, ngay cả khi trường đó có giá trị null Nếu bạn không thêm trường vào sparse index khi thực hiện thao tác chèn, nó sẽ bị bỏ qua.
Việc kết hợp sparse index với unique index cho phép ngăn chặn việc thêm dữ liệu trùng lặp vào cơ sở dữ liệu, đồng thời cho phép bỏ qua trường được lập chỉ mục khi không được thêm vào trong quá trình insert, giúp tăng hiệu suất và đảm bảo tính toàn vẹn dữ liệu.
The TTL index is a special type of index in MongoDB that automatically deletes documents from a collection after a specified period This index is ideal for managing data types such as event data, logs, and sessions.
Lưu ý: TTL index chỉ hoạt động với những field có kiểu là Date
Trong cơ sở dữ liệu, chỉ mục (index) là cấu trúc dữ liệu giúp tăng tốc độ truy xuất thông tin Đặc biệt, trong MongoDB, chỉ mục lưu trữ một phần dữ liệu của collection theo cách dễ dàng duyệt Nó chứa giá trị của một hoặc nhiều trường và được sắp xếp theo giá trị đó Việc lập chỉ mục nhằm cải thiện hiệu suất truy vấn dữ liệu Để tạo chỉ mục, ta sử dụng phương thức createIndex() với cú pháp: db.collectionName.createIndex({: , …}).
The createIndex() method only creates an index if it does not already exist To check for existing indexes, use the getIndexes() method with the syntax: db.collectionName.getIndexes() To delete an index, utilize the dropIndex() method with the syntax: db.collectionName.dropIndex(fieldName).
Tìm kiếm
MongoDB cung cấp khả năng tìm kiếm văn bản cho nội dung chuỗi thông qua việc sử dụng chỉ mục văn bản và toán tử $text.
MongoDB cung cấp chỉ mục văn bản để hỗ trợ truy vấn tìm kiếm văn bản trên nội dung chuỗi Chỉ mục này có thể bao gồm bất kỳ trường nào có giá trị là chuỗi hoặc mảng các phần tử chuỗi Để thực hiện truy vấn tìm kiếm văn bản, cần có một chỉ mục văn bản trong bộ sưu tập Mỗi collection chỉ có thể có một chỉ mục tìm kiếm văn bản, nhưng chỉ mục đó có thể bao gồm nhiều trường, ví dụ: db.stores.createIndex( { name: "text", description: "text" } ).
Sử dụng toán tử truy vấn $text để thực hiện tìm kiếm văn bản trên một collection có chỉ mục văn bản.
Nội dung sẽ mã hóa chuỗi tìm kiếm bằng cách sử dụng khoảng trắng và hầu hết các dấu câu làm dấu phân cách, đồng thời thực hiện logic OR cho tất cả các mã thông báo trong chuỗi tìm kiếm.
You can use the following query to find all stores that contain any terms from the list "coffee," "shop," and "java": db.stores.find({ $text: { $search: "java coffee shop" } }).
Bạn có thể tìm kiếm các cụm từ chính xác bằng cách sử dụng dấu ngoặc kép Khi chuỗi $search chứa cả cụm từ và các từ riêng lẻ, tìm kiếm sẽ chỉ trả về các tài liệu có chứa cụm từ đó.
Ví dụ: phần sau sẽ tìm thấy tất cả các tài liệu có chứa "coffee shop": db.stores.find( { $text: { $search: "\"coffee shop\"" } } )
❖ Loại trừ từ Để loại trừ một từ, bạn có thể thêm vào trước một ký tự "-"
Ví dụ: để tìm tất cả các cửa hàng có chứa "java" hoặc "shop" nhưng không chứa
"coffee", hãy sử dụng như sau: db.stores.find( { $text: { $search: "java shop -coffee" } } )
CÀI ĐẶT VÀ DEMO
Cài đặt MongoDB trên Windows
Truy cập vào link https://www.mongodb.com/try/download/community để thực hiện tải xuống file cài đặt
Click đúp vào file vừa tải về thành công để tiến hành cài đặt
Bấm Next để tiếp tục, sau đó chọn “I accept the terms in the License Agreement” và bấm Next để sang bước tiếp theo
Chọn kiểu setup thì với các những ai chưa quen thì chọn “Complete” để nó cài đặt tất cả các phần mềm phụ trợ
Trong trường hợp bạn muốn tùy chỉnh (Custom) thì nó sẽ hiện ra các mục mà bạn muốn thiết lập
Tiếp theo, chọn thư mục lưu data và log cho MongoDB
Sau khi cài đặt thành công, tiếp theo ta tạo biến môi trường cho MongoDB: thêm đường dẫn đến thư mục bin của MongoDB vào Path của System variables
Chạy thử MongoDB bằng cách mở màn hình cmd hoặc powerShell và chạy lệnh mongo:
Demo các lệnh quản trị MongoDB
Hiển thị các database hiện có:
Tạo collection trong database csdl-chat7:
Thêm dữ liệu (document) vào collection:
Hiển thị tất cả các bản ghi trong collection:
Lọc các thành viên có tuổi nhỏ hơn hoặc bằng 24 và có job là “coder”:
Tạo chỉ mục đối với field là name, loại là text để hỗ trợ tìm kiếm chuỗi:
Tìm kiếm các thành viên mà thông tin có chứa chữ “Tran” và “Nguuyen”.