Bộ sưu tập (Collection)

Một phần của tài liệu TIỂU LUẬN kết THÚC học PHẦN đề tài tìm HIỂU về hệ QUẢN TRỊ cơ sở dữ LIỆU MONGODB (Trang 32)

2. Tạo Collection

Khác với các các hệ quản trị cơ sở dữ liệu như SQL Server, MongoDB sử dụng khái niệm collection thay vì khái niệm bảng. Các collection cũng có chức năng tương tự bảng nhưng nó lưu trữ data dưới dạng JSON nên không có số lượng cột cố định, khi hiển thị thì mỗi field sẽ hiển thị giống như 1 cột trong bảng.

23

Để tạo một collection mới trong database, ta sẽ sử dụng câu lệnh:

>Db.createCollection(< tên collection>, options )

Trong đó, options là các tùy chọn kèm theo như kích thước, khả năng index,... được thể hiện ở bảng sau:

Bảng 5 Các tùy chọn cấu hình cho Collection Nguồn: MongoDB Documentation

Tham số capped size max autoIndexId usePowerOf2Sizes noPadding storageEngine validator validationLevel validationAction

indexOptionDefaults viewOn

pipeline

collation writeConcer

Tương tự như xem các databases trong hệ thống ,để xem các collections có trong database, ta sử dụng câu lệnh:

>Show collections

Ví dụ, trong database shopping đã tạo ở trên , ta tạo một collection tên “car” như sau:

Các collections ban đầu của database shopping

Thực hiện lệnh create tạo collection “Car” Xuất hiện collection car trong danh sách collecions

Ta cũng có thể tạo collection theo một cách khác. Đó chính là insert một tài liệu (document) và collection vào database. Khi đó, collection được insert dữ liệu vào chưa tồn tại, hệ thống sẽ tự động tạo collection mới để insert vào.

25

Ví dụ ta thêm một document với các dữ liệu như sau vào collection sneaker trong khi chưa có collection này trong hệ thống:

Để xóa collection không cần dùng tới nữa , ta sử dụng lệnh drop(). Cú pháp:

>db.<tên collection>.drop()

Ví dụ ở đây ta muốn xóa đi collecion car, ta thực hiện:

2. Một số kiểu dữ liệu trong MongoDB

26

Hình 16 Các kiểu dữ liệu trong MongoDB

3. Các thao tác CRUD

Bảng 6 Các thao tác CRUD trong MongoDB

Thao tác Cú pháp

Insert >db.<tên

collection>.insertOne()

>db.<tên

collection>.insertMany()

Read >db.<tên collection>.find()

Update >db.<tên collection>.updateOne() >db.<tên collection>.updateMany() Delete >db.<tên collection>.deleteMany()

>db.<tên

collection>.deleteOne() 4. Một số toán tử so sánh

Bảng 7. Các toán tử so sánh trong MongoDB. Nguồn:viblo.asia

Name $eq $gt $gte $in $lt $lte $ne $nin AI. Khung nhìn

Khung nhìn (view) trong MongoDB là một đối tượng có thể truy vấn, có nội dung được xác định bởi một câu truy vấn tổng hợp trên các collection hoặc các views khác. MongoDB không hỗ trợ thao tác chỉnh sửa đối với các khung nhìn

1. Tạo khung nhìn

Để tạo một khung nhìn, ta có 2 cách để tạo :

- Sử dụng phương thức createCollection(). Cú pháp: db.createCollection( "<viewName>", { "viewOn" : "<source>", "pipeline" : [<pipeline>], "collation" : { <collation> } } ) - Sử dụng lệnh create. Cú pháp: db.createView( "<viewName>", "<source>", [<pipeline>], { "collation" : { <collation> } } ) 28

4. Các hạn chế trên khung nhìn

- Chỉ cho phép đọc: khung nhìn chỉ cho phép đọc, các thao tác chỉnh sửa trên khung nhìn đều sẽ gặp lỗi.

- Không thể thay đổi tên của khung nhìn

- Chỉ có thể chỉ định một Collation (đối chiếu) tại thời điểm khởi tạo. Nếu không được chỉ định, hệ thống sẽ tự động chỉ định Collation là đối chiếu nhị phân đơn giản. Nghĩa là khung nhìn không được kế thừa Collation mặc định của Collection.

- Khi sử dụng phương thức find(), khung nhìn không hỗ trợ các phép toán và phép chiếu như: $, $elemMatch, $slice, $meta.

5. Các thao tác được hỗ trợ trên khung nhìn:

Bên cạnh các hạn chế nêu trên, MongoDB hỗ trợ các thao tác sau trong khung nhìn, được thể hiện ở bảng sau [1]:

Bảng 8 Các thao tác trên view

Lệnh create collMod find distinct count BI. Chỉ mục

Như đã đề cập ở mục thành phần của MongoDB, chỉ mục (index) giúp việc truy vấn dữ liệu trở nên hiệu quả hơn. Nếu không có chỉ mục, MongoDB sẽ phải quét một lượng lớn dữ liệu để chọn ra các document kết nối với lệnh truy vấn.

Để tạo một chỉ mục, ta sử dụng phương thức ensureIndex() của MongoDB. Cú pháp: Trong đó:

>db.<tên collection>.ensureIndex({field: value})

- Field là tên trường cần tạo chỉ mục

- Value có giá trị là 1 để tạo chỉ mục theo thứ tự tăng dần hoặc -1 để tạo theo thứ tự giảm dần.

29

Phương thức ensureIndex() cho phép truyền nhiều trường khác nhau, các trường phân biệt nhau bởi dấu “,”. Phương thức này cũng cung cấp danh sách các tùy chọn được liệt kê trong bảng dưới đây

Bảng 9 Danh sách các tùy chọn để tạo chỉ mục2

Tham số background unique name dropDups sparse

2Tham khảo Hoclaptrinh.vn

30

expireAfterSeconds

v

weights

default_language

language_override

IV. Hàm và thủ tục (Stored Procedure -SP)

Trong MongoDB không có khái niệm tương đương với SP trong SQL nhưng nó cung cấp một tính năng có chức năng tương tự là Stored Javascript. Ta có thể lưu trữ một Javascript logic trong một collection đặc biệt và sử dụng lại khi cần thiết.

Giả sử, ta cần tạo một hàm để cộng hai số với hai tham số đầu vào và trả về tổng của chúng. Hàm này được viết trong javascript như sau:

function sum ( x , y ) { return x + y ; }

MongoDB cung cấp một collection đặc biệt trong mọi cơ sở dữ liệu tên là system.js – đây là nơi chứa các hàm Javascript tùy chỉnh của người dùng. Để thêm hàm mới vào collection này ta thực hiện như sau:

31

Cú pháp :

>db.system.js.save()

Áp dụng:

Ở đây, ta chuyển tên hàm vào field _id và chuyển thân hàm vào field value để dễ dàng gọi hàm sau này.

Lúc này, hàm đã được lưu trữ trong collection system.js . Giả sử ta có một collection chứa các document như sau:

Bây giờ, ta sẽ dùng hàm sum vừa tạo ở bước trên để kiểm tra xem các document thỏa mãn x+y = 8. Ta sẽ dùng bộ $where để kiểm tra điều kiện này như sau:

32

Ta cũng có thể xem lại danh sách các hàm đã được lưu trữ. Vì các hàm này đều được lưu trữ trong một system.js như một collection bình thường nên ta sử dụng phương thức find() để tìm tất cả các hàm được lưu trữ:

V. Ràng buộc

Do MongoDB là một cơ sở dữ liệu NoSQL nên trong hệ quản trị này không có các ràng buộc như khóa ngoại trong các cơ sở dữ liệu SQL. Tuy nhiên trong MongoDB cung cấp giá trị “_id” được tự động tạo cho mỗi document. Giá trị này là duy nhất và được xem như là primary key.

Tuy nhiên, nếu ta muốn tạo ra các ràng buộc trên nhiều Field, ta có thể thực hiện điều này bằng cách tạo ra một collection có chức năng hoạt động như một Collection proxy. Collection này sẽ gồm các dữ liệu tham chiếu đến document gốc hay ObjectId của document này và unique key do ta tạo ra.

Ví dụ ta có một collection “user” như sau:

Trong collection này ta có thể thấy, bên cạnh _id ObjectId thì địa chỉ email cũng là một thuộc tính duy nhất. Như thế ta có thể dùng giá trị này để làm khóa duy nhất. Khi đó, Collection proxy sẽ có những dữ liệu sau

33

Trong MongoDB, ta sẽ dùng chỉ mục duy nhất (Unique Index) để hiện thực hóa điều này:

Một số lưu ý khi sử dụng unique key:

- Ứng dụng sử dụng cơ sở dữ liệu này phải có bắt lỗi khi chèn document và collection proxy và phải có tính nhất quán giữa các collection liên quan. - Nếu collection proxy yêu cầu phân đoạn thì ta phải thực hiện phân đoạn trên

Field cần thực thi tính duy nhất.

- Để áp dụng tính duy nhất trên nhiều Field bằng proxy phân đoạn, ta phải có tập hợp các proxy cho mọi Field. Nếu tạo nhiều unique index trên một proxy thì sẽ không thể chia nhỏ các collection proxy để sử dụng.

VI. Bẫy lỗi (Trigger)

Trong MongoDB, hệ quản trị cơ sở dữ liệu này không có bất kì hỗ trợ nào về trigger. Tuy nhiên ta có thể tự tạo ra thủ tục này bằng một số thủ thuật. Khi ta thao tác dữ liệu trong MongoDB thì tất cả các hành động này sẽ được ghi vào nhật ký hoạt động được gọi là oplog. Về cơ bản, Oplog là một danh sách chạy các sửa đổi được thực hiện với dữ liệu. Các Replica Set sẽ lắng nghe các thay đổi trên oplog và thực hiện các thay đổi này trong các bản sao cục bộ của nó. Do đó ta có thể tự tạo ra thủ tục trigger dựa trên điều này bằng các công cụ có sẵn của MongoDB. Hiện nay, một số sản phẩm khác có liên quan với MongoDB đã được tích hợp thêm thủ tục Trigger như MongoDB Realm hay MongoDB Atlas.

CHƯƠNG 4: QUẢN TRỊ NGƯỜI DÙNG VỚI HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU MONGODB

I. Quyền và vai trò (role) trong MongoDB

Khi làm việc với bất kì cơ sở dữ liệu nào, việc phân quyền, thiết lập tài khoản cho user là một việc vô cùng cần thiết. Nhất là khi ta xây dựng các phần mềm, hoặc chia sẻ cơ sở dữ liệu trong một nhóm. Với MongoDB thì điều này cũng không phải là ngoại lệ. MongoDB cung cấp quyền truy cập của user dựa trên vai trò (roles) của user đó. Hệ quản trị này cung cấp nhiều role tích hợp để gán cho người dùng. Bên cạnh đó , nó cũng cho phép tạo người sử dụng tạo ra các role theo nhu cầu.

1. Các quyền và vai trò tích hợp có sẵn trong hệ thống

Trong MongoDB, các role có sẵn này được chia ra làm 4 nhóm role : a) Nhóm Database User Roles

34

Các role thuộc nhóm này được thiết lập riêng cho một database được chỉ định và chỉ cho phép người dùng thao tác trên dữ liệu chứ không cho phép tác động đến các user khác trong hệ thống. Các role này thường được phân quyền cho các client. Nhóm này bao gồm hai quyền như sau:

Bảng 10 Nhóm Database User Roles

Role Read

readWrite

b) Nhóm Database Administration Roles

Với nhóm role này, hệ thống sẽ cấp một số quyền quản trị nhất định trên một database được chỉ định cho user. Bao gồm các role như sau:

Bảng 11 Nhóm Database Administration Roles

Role dbAdmin

userAdmin

dbOwner

c) Nhóm All Database Roles

Nhóm role này chỉ dành cho các database Admin. Nó có thể xem như là các quyền mở rộng hơn của 2 nhóm role trên , thay vì user chỉ có quyền trên một database thì với nhóm role này, user có quyền trên toàn bộ database có trong hệ thống. Cụ thể:

Bảng 12 Nhóm All Database Roles

Roles readAnyDatabase readWriteAnyDatabase userAdminAnyDatabase dbAdminAnyDatabase d) Nhóm Supperuser Roles

Nhóm role này chỉ có duy nhất một role đó là Root. Đây là quyền cao nhất trong hệ quản trị cơ sở dữ liệu MongoDB. Với quyền này người dùng có thể thực hiện mọi thao tác trên hệ thống như cung cấp quyền truy cập ,quản trị cơ sở dữ liệu ,truy cập đến mọi

36

nguồn lực trong cơ sở dữ liệu... Do đó quyền này chỉ được phân cho người quản trị có quyền cao nhất trong hệ thống.

Ngoài các nhóm role phân quyền theo cấp database và cấp hệ thống như trên, MongoDB còn có các nhóm role như: Backup and Restoration Roles, Cluster Administration Roles,...

2. Tạo quyền và vai trò tùy chỉnh (Role)

Bên cạnh các role được tích hợp sẵn trong hệ thống, MongoDB cũng cho phép người dùng tự tạo ra các role tùy chỉnh và thiết lập các đặc quyền riêng phù hợp với mong muốn của họ. Một yêu cầu được đặt ra khi ta tạo một role mới đó là ta phải tạo role trong một database cụ thể. Vì trong MongoDB, hệ quản trị này sử dụng sự kết hợp giữa tên database và role để đảm bảo rằng mỗi role là duy nhất. Ngoại trừ các role được tạo trong database admin thì một role chỉ có thể bao gồm các đặc quyền áp dụng cho database của nó và chỉ có thể kế thừa từ các role khác trong database của nó. Nếu một role được tạo trong database admin, thì nó có thể bao gồm các đặc quyền áp dụng cho database này, bao gồm các quyền admin, quản lý cluster và có thể kế thừa từ các role khác trong tất cả các database trong hệ thống.

Để dễ dàng quản lý các role tùy chỉnh này, MongoDB lưu trữ thông tin của chúng trong một collection đặc biệt tên là system.roles thuộc database admin. Collection này không cho phép truy cập trực tiếp vài mà phải sử dụng các lệnh quản lý role để xem và chỉnh sửa.

Khi muốn tạo một role mới, ta sử dụng phương thức db.createRole(). Giả sử, ở đây ta muốn tạo một role mới có tên là saler được mô tả như sau:

- saler cho phép đọc và chỉnh sửa dữ liệu trong database “mydata” - saler cho phép đọc collection “Foods” trong database “shopping” Ta thực hiện tạo role mới như sau:

Đầu tiên ta sẽ khai báo một biến mới tên role để lưu trữ tên (role) và các thao tác (privileges), quyền (roles) của saler. Sau đó sử dụng cú pháp sau để tạo role:

37

>db.createRole(role);

Role tùy chỉnh mới đã được tạo thành công. AI. Quyền đăng nhập hệ thống

Mặc định trong mongoDB, chúng ta có thể sử dụng MongoDB Server mà không cần phải đăng nhập vào hệ thống. Tuy nhiên , trong một số trường hợp thì việc sử dụng user để thao tác trên MongoDB Server sẽ cho kết quả tốt hơn và đảm bảo tính bảo mật của cơ sở dữ liệu. Ở MongoDB thì tài khoản đăng nhập cũng chính là user trong hệ thống, do đó ta sẽ gom chung việc khởi tạo tài khoản và khởi tạo user làm một.

Trong MongoDB, ta tạo user mới bằng phương thức createUser(). Cú pháp:

Để tạo một user cấp hệ thống, ta thực hiện tạo một user trên database admin, user này sẽ có thể truy cập và chỉnh sửa các database khác nếu quyền của user này cho phép.

Ví dụ, đầu tiên ta sẽ tạo một user cấp hệ thống với username = “ad”, password =”1234”. User này sẽ được gán quyền là root, tức quyền cao nhất trong hệ thống:

38

Trong MongoDB, để đăng nhập bằng user và password, ta sẽ có 2 cách để đăng nhập:

- Cách 1: chỉ rõ username và password Ta sử dụng cú pháp :

Ví dụ, ta sẽ đăng nhập bằng tài khoản user vừa tạo ở trên:

- Cách 2: Đăng nhập với phương thức db.auth()

Với cách này, đầu tiên ta sẽ truy cập vào bằng lệnh mongo, sau đó sử dụng lệnh db.auth() trên database cần xác thực:

Như vậy ta đã đăng nhập thành công vào hệ thống. Sau khi đăng nhập vào hệ thống bằng user có quyền root, ta có thể tạo ra các user khác ở cả cấp hệ thống và cấp cơ sở dữ liệu. Giả sử ở đây, ta sẽ tạo một user có username là “person1” có password là “123” với quyền đọc /ghi trên database shopping. Ta thực hiện như sau:

39

BI. Quyền truy xuất dữ liệu

Như đã nói ở 2 phần trên, quyền truy xuất dữ liệu trong MongoDB cũng được chia làm 2 loại là :

- Quyền truy xuất cấp hệ thống: bao gồm các quyền thuộc nhóm All Database Roles và nhóm Supperuser Roles. Các quyền này cho phép user truy cập đến nhiều database có trong hệ thống với các thao tác được quy định.

- Quyền truy xuất cấp cơ sở dữ liệu: Quyền này bao gồm nhóm quyền nhóm

Database User Role và nhóm Database Administration Roles. Các quyền này sẽ cho phép user được gán quyền chỉ có thể thao tác truy xuất đến một database cụ thể được chỉ định.

Ví dụ, với 2 user vừa tạo ở phần trên, ta có user ad được gán quyền câp hệ thống và user person1 được gán quyền cấp cơ sở dữ liệu. Với user ad, do được gán

quyền root là quyền cao nhất trong cơ sở dữ liệu, user này có thể tạo tài khoản user mới như ở trên. Bên cạnh đó user này còn có quyền truy xuất đến các database khác ngoài database admin:

- Insert dữ liệu vào database number như sau:

- Xem collection Clothes trong database shopping

40

Tiếp theo, với user person1 vừa tạo, ta sẽ sử dụng tài khoản này để đăng nhập vào hệ

Một phần của tài liệu TIỂU LUẬN kết THÚC học PHẦN đề tài tìm HIỂU về hệ QUẢN TRỊ cơ sở dữ LIỆU MONGODB (Trang 32)

Tải bản đầy đủ (DOCX)

(52 trang)
w