Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 34

TRƯỜNG ĐẠI HỌC NGÂN HÀNG TP.

HỒ CHÍ MINH

MÔN: HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU

ĐỀ TÀI: TÌM HIỂU HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU MONGODB

Giảng viên hướng dẫn: Nguyễn Văn Kiên


Lớp: ITS322_221_1_D01
Nhóm gồm các sinh viên:
Nguyễn Hoàng Hải – 030237210067
Lê Văn Học - 030237210081.
Nguyễn Ngọc Gia Huy - 030237210086.
Võ Ngọc Sơn - 030237210162.
Nguyễn Thành Tiến – 030237210185.
Nguyễn Đức Trung - 030237210199.
Triệu Tuấn Vĩ – 030237210212.

TP HỒ CHÍ MINH, 26 THÁNG 10 NĂM 2022


MỤC LỤC
I. TÌM HIỂU VỀ CƠ SỞ DỮ LIỆU NOSQL, HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU MONGODB VÀ CÁC
KHÁI NIỆM CƠ BẢ
N..................................................................................................................................................................3
1. Cơ sở dữ liệu NOSQL..........................................................................................................................3
2.Hệ quản trị cơ sở dữ liệu MongoDB.........................................................................................................5
3. Các khái niệm cơ bản trong MongoDB.................................................................................................6
II. THỰC HIỆN TẠO CƠ SỞ DỮ LIỆU VÀ THỰC HIỆN CÁC THAO TÁC..........................................7
1. Tạo cơ sở dữ liệu...................................................................................................................................12
2.Một số thao tác khác...............................................................................................................................13
III. TÌM HIỂU VỀ CÁC TOÁN TỬ SO SÁNH SỬ DỤNG TRONG CÂU TRUY VẤN.......................19
IV. TÌM HIỂU CÁCH TRUY VẤN DOCUMENT LỒNG NHAU..........................................................21
V.TÌM HIỂU VỀ PHƯƠNG THỨC AGGREGATE VÀ CÁC TOÁN TỬ TRONG AGGREGATION
PIPELINE..................................................................................................................................................27
VI. THỰC HIỆN SAO LƯU VÀ PHỤC HỒI DỮ LIỆU..........................................................................31
VII. SỬ DỤNG CƠ SỞ DỮ LIỆU SINHVIEN VÀ THỰC HIỆN MỘT SỐ CÂU TRUY VẤN..................

DANH MỤC TÀI LIỆU THAM KHẢO...................................................................................................17

Trang 2
I. TÌM HIỂU VỀ CƠ SỞ DỮ LIỆU NOSQL, HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU
MONGODB VÀ CÁC KHÁI NIỆM CƠ BẢN:
1. Cơ sở dữ liệu NOSQL

a) NoSQL là gì ?

NoSQL – Not Only SQL, là một thế hệ CSDL mới với các đặc điểm nổi bật như:
không ràng buộc Non relation , phân tán Distribute, mã nguồn mở open source, có
khả năng mở rộng theo chiều ngang Horizontal scalable, lược đồ tự do free
schema, PI đơn giản,... Có thể lưu trữ xử lý dữ liệu từ một lượng rất nhỏ cho đến
hàng petabytes trong một hệ thống chịu tải, chịu lỗi cao và đáp ứng thời gian thực.
NoSQL bao gồm hàng loạt các công nghệ CSDL khác nhau đã được phát triển để
đáp ứng với nhu cầu gia tăng khối lượng dữ liệu, tần số truy cập và hiệu xuất xử lý,
cùng với khả năng lưu trữ tiết kiệm. Cơ sở dữ liệu quan hệ không được thiết kế để
đáp ứng những thách thức về quy mô lưu trữ và khả năng xử lý nhanh chóng của
các ứng dụng hiện đại này.

b) Lịch sử phát triển của NoSQL:

Thuật ngữ NoSQL đã được sử dụng bởi Carlo Strozzi trong năm 1998 như là tên
của tập tin dựa trên cơ sở dữ liệu mà ông đang làm. Đó là tên gọi chung cho các cơ
sở dữ liệu quan hệ nguồn mở nhỏ. Đây là một cơ sở dữ liệu quan hệ mà không có
một giao diện SQL. Như vậy nó không thực sự là một phần của phong trào NoSQL
của chúng ta ngày nay.
Thuật ngữ này lại nổi lên vào năm 2009 khi Eric Evans nhân viên của
Rackspace, được ủy thác dự án Cassandra, 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. Eric Evans đã sử dụng “NoSQL” để đặt tên cho các đột biến hiện nay
trong cơ sở dữ liệu phi quan hệ, thuật ngữ NoSQL thường được sử dụng với ý
nghĩa là "không chỉ SQL" để mô tả sự gia tăng của các dự án và sản phẩm mới.

c) Đặc điểm của cơ sở dữ iệu NoSQL:

Hầu hết các CSDL NoSQL điều có chung một số đặc điểm nổi bật. Tất nhiên,
NoSQL là một khái niệm rất rộng và có rất nhiều hệ quản trị CSDL khác nhau,
nhưng chúng đều có nhiều hoặc ít hơn các đặc điểm này. Tuy nhiên, có thể nói
CSDL NoSQL có thể mang các đặc điểm như sau:
Mô hình dữ liệu phi quan hệ ( Non-relational ): Bao gồm các mô hình dữ liệu
khác nhau nhưng nhìn chung không có mối quan hệ ràng buộc lẫn nhau. Có thể có
những cấu trúc dữ liệu phức tạp hơn, nhưng nó không cứng nhắc như mô hình dữ
liệu quan hệ. “Non-relational” là khái niệm không sử dụng các ràng buộc dữ liệu
cho nhất quán dữ liệu ở NoSQL database.

Trang 3
Lưu trữ phân tán ( Distributed storage ): Hệ thống CSDL NoSQL được phân
tán sang nhiều máy tính khác nhau, để cung cấp dữ liệu cho người dùng. Mỗi phần
dữ liệu sau đó sẽ được nhân rộng trên một số lượng nhất định máy dự phòng với
tính sẵn sàng đáp ứng cao. Mô hình lưu trữ phân tán các tập tin hoặc dữ liệu ra
nhiều máy tính khác nhau trong mạng LAN hoặc Internet dưới sự kiểm soát của
phần mềm quản lý.
Nhất quán cuối ( Eventual consistency): Tính nhất quán của dữ liệu không cần
phải đảm bảo ngay tức khắc sau mỗi tác vụ ghi. Một hệ thống phân tán chấp nhận
những ảnh hưởng theo phương thức lan truyền và sau một khoảng thời gian, cuối
cùng dữ liệu trên hệ thống sẽ trở lại trạng thái nhất quán.
Khả năng mở rộng chiều dọc ( Vertical scalable): Khi dữ liệu lớn về số lượng,
phương pháp tăng cường khả năng lưu trữ và xử lý bằng việc cải tiến phần mềm và
phần cứng trên một máy tính đơn, được gọi là khả năng mở rộng chiều dọc.
Khả năng mở rộng chiều ngang ( Horizontal scalable): Khi dữ liệu lớn về số
lượng, phương pháp tăng cường khả năng lưu trữ và xử lý là dùng nhiều máy tính
phân tán. Phân tán dữ liệu được hỗ trợ bởi phần mềm tức cơ sở dữ liệu. Hàng trăm
máy tính nhỏ được gộp lại tạo thành một hệ thống tính toán mạnh hơn nhiều so với
vi xử lý RISC truyền thống đơn lẻ . Mô hình này tiếp tục được hỗ trợ bởi các công
nghệ kết nối Myrinet và InfiniBand. Từ đó chúng ta có thể quản lý, bảo trì từ xa,
xây dựng batch procession (xử lý đồng loạt tập lệnh) tốt hơn. Do những đòi hỏi về
tốc độ xử lý I/O cao, lượng cực lớn dữ liệu... Mở rộng theo chiều ngang sẽ thúc
đẩy các công nghệ lưu trữ mới phát triển giống như object storage devices OSD .
Phi cấu trúc ( SchemaFree ) : Không cần thiết kế các bảng, các cấu trúc như của
SQL. Thay vào đó chỉ cần lưu trữ các giá trị mới vào CSDL, không cần phải xác
định cấu trúc trước.
- Không hỗ trợ SQL
- Dữ liệu lớn (Big Data)
- Dùng SE thay thế cho CID
Triển hai linh hoạt ( Deployment Flexibility ): Việc bổ sung loại bỏ các node,
hệ thống sẽ tự động nhận biết để lưu trữ mà không cần phải can thiệp bằng tay. Hệ
thống cũng không đòi hỏi cấu hình phần cứng mạnh, đồng nhất.
d) Ưu điểm:
 Đáp ứng được sự tăng trưởng của dữ liệu lớn (Big Data) .
 Truy xuất dữ liệu lớn với tốc độ cao.
 Dữ liệu đa dạng, có cấu trúc, bán cấu trúc hoặc phi cấu trúc.
 Dữ liệu phức tạp, được lưu trữ và quản lý tại các trung tâm lưu trữ khác.
 Cần ít tài nguyên và phần cứng của máy chủ để triển khai.
 Hỗ trợ đánh chỉ mục Index tất cả các thuộc tính.
 Mã nguồn mở.
 Mở rộng theo chiều dọc.
 Các CSDL NoSQL khác nhau cho những dự án khác nhau

Trang 4
 NoSQL phù hợp với công nghệ đám mây: NoSQL và đám mây là một sự trùng
khớp tự nhiên, chúng có khả năng tận dụng được việc cung cấp mềm dẻo của đám
mây
 Ngăn ngừa được sự thực thi không ổn định của I/O.

e) Nhược điểm:

 Hỗ trợ không đồng đều cho các doanh nghiệp.


 Sự tin tưởng chưa cao đối với nhiều doanh nghiệp.
 Các CSDL NoSQL không có nhiều sự liên hệ tới các công cụ BI thường được sử
dụng.
 Tính mới mẻ của NoSQL có nghĩa là không có nhiều lập trình viên và người
quản trị mà biết công nghệ này.
 Những vấn đề về tính tương thích: Mỗi CSDL NoSQL có các giao diện lập trình
ứng dụng API riêng của mình, các giao diện truy vấn độc nhất vô nhị, và những sự
riêng biệt.
 Khó khăn trong việc lưu trữ các dữ liệu mang nội dung nghiệp vụ phức tạp.
2. Hệ quản trị cơ sở dữ liệu MongoDB

a) Giới thiệu về MongoDB :

MongoDB là một cơ sở dữ liệu NoSQL hướng tài liệu, mã nguồn mở được viết
hoàn toàn bằng ngôn ngữ C++. MongoDB được trang bị khả năng mở rộng, hiệu
suất cao, đảm bảo tính nhất quán, dễ dàng mở rộng và có lược đồ tự do. Đây là một
cơ sở dữ liệu phi quan hệ thay vì lưu trữ dữ liệu theo các bảng như cơ sở dữ liệu
truyền thống, MongoDB lưu trữ cấu trúc dữ liệu thành các văn bản dựa vào JSON
với mô hình động, các văn bản này có thể lồng vào nhau tạo nên một hệ thống cây
phân cấp phức tạp, nhưng điều này khiến cho việc tích hợp dữ liệu cho các ứng
dụng trở nên nhanh và dễ dàng truy vấn và đánh chỉ mục hơn.
Mục đích chính trong việc phát triển MongoDB chính là thu hẹp khoản cách giữa
cơ sở dữ liệu cặp khoá – giá trị có tính đáp ứng nhanh và khả năng mở rộng cao và
cơ sở dữ liệu quan hệ truyền thống với các chức năng hỗ trợ phong phú. MongoDB
giữ lại các thuộc tính thân thiện của SQL. Do đó các câu truy vấn khá giống với
SQL nên MongoDB khá thích hợp để chuyển đổi từ ngôn ngữ truy vấn SQL sang
NoSQL.
MongoDB được sử dụng tốt nhất với nhu cầu cần truy vấn động. Nó thích hợp cho
các ứng dụng tầm trung trở lên, đặc biệt nếu chúng ta cần tốc độ nhanh cho một cơ
sở dữ liệu lớn vì MongoDB ngoài tốc độ đọc nhanh ra thì tốc độ ghi của nó cũng
rất nhanh. MongoD đi kèm với một trình tiện ích JavaScript đơn giản nhưng mạnh
mẽ, nó hữu ích trong quản trị và thao tác dữ liệu.

b) Lịch sử phát triển MongoDB:

Quá trình phát triển của Mongo với một số cột mốc:

Trang 5
 MongoDB được xây dựng tại công ty 10gen, trong một dự án xây dựng nền tảng
cho một dịch vụ giống như Google App Egine vào năm 2007.
 Đến năm 2009 MongoD trở thành một sản phẩm độc lập với mã nguồn mở cùng
với giấy phép AGPL.
 Trong tháng 3 năm 2011, từ phiên bản 1.4 đã hoàn thiện và sẵn sàng đưa vào sử
dụng.
 Phiên bản mới nhất là 3.0.5 được phát hành vào ngày 28 tháng 07 năm 2015.

c) Đặc điểm của MongoDB :

Lưu trữ hướng Document: Có thể lưu trữ các kiểu tài liệu phức tạp như : mảng,
bảng, băm, kiểu integer, các BSON object và tất cả các kiểu dữ liệu được JSON hỗ
trợ.
 Hỗ trợ chỉ mục đầy đủ: các thao tác trên chỉ mục như xoá hay cấp lại chỉ mục.
Hỗ trợ chỉ mục trên bất kỳ các thuộc tính bao gồm:
 Chỉ mục duy nhất
 Chỉ mục hỗn hợp
 Chỉ mục trên mảng
 Chỉ mục TTL (TTL- Time to live)
 Chỉ mục rãi rác
 Chỉ mục tìm kiếm văn bản (text)
 Tính sao chép và tính sẵn sàng cao: khả năng chịu lỗi, chịu tải cao, tính nhất
quán.
 Lưu trữ phân tán (sharding)
 Mở rộng theo chiều ngang.
 Tự động phân cụm dữ liệu
 Tự động cân bằng giữa các cụm dữ liệu thông qua các thao tác thêm hay gỡ bỏ.
 Phân cụm cho tất cả các bộ sưu tập, trừ các bộ sưu tập có kích thước nhỏ.
 Lưu trữ bản dự phòng khi phát sinh sự cố
 Ứng dụng kết nối các cụm dữ liệu thông qua tiến trình mongos.
 Mô hình đơn giản.
 Truy vấn : Dễ dàng và đa dạng.
 Hiệu quả trong lưu trữ các tập tin nhị phân, không làm thay đổi dung lượng và
truy xuất nhanh chóng.
3. Các khái niệm cơ bản trong MongoDB (database, collection, document,
field):

a) Database:

Database là một nơi lưu trữ vật lý cho các bộ sưu tập (Collection). Mỗi Database
lấy tập hợp các file riêng của nó trên hệ thống file. Mỗi MongoDB Server có thể có
nhiều cơ sở dữ liệu.
Cơ sở dữ liệu (Database) MongoDB nằm trên một máy chủ MongoDB, máy chủ
Trang 6
này có thể lưu trữ nhiều cơ sở dữ liệu một cách độc lập và riêng biệt. Một cơ sở dữ
liệu chứa một hay nhiều bộ sưu tập, trong bộ sưu tập chứa các tài liệu.

b) Collection :

Collection: là một nhóm các dữ liệu thuộc cùng loại do người dùng quy định,
sự khác nhau giữa collection với table trong RDBMS đó là collection không có
răng
buộc, quan hệ với collection khác. Mỗi dữ liệu trong collection không cố định về
số
trường như row trong table.

c) Document :

Một Document trong MongoDB, có cấu trúc tương tự như kiểu dữ liệu JSON, là
một tập hợp các cặp key-value. Các Document có schema động, nghĩa là
Document trong cùng một Collection không cần thiết phải có cùng một tập hợp các
trường hoặc cấu trúc giống nhau, và các trường chung trong Document của một
Collection có thể giữ các kiểu dữ liệu khác nhau.
_id: là trường bắt buộc phải có trong mỗi document. Trường này biểu diễn các
giá trị duy nhất cho từng document. Vì nó là bắt buộc nên nếu không thiết lập giá
trị
cho nó MongoDB sẽ tự động sinh ra trường này.

d) Field:

Field trong MongoDB là một cặp “tên - giá trị” trong một Docunment. Một
Document có thể không có hoặc có nhiều Field. Các Field giống các cột ở hệ thống
cơ sở dữ liệu.
* So sánh hệ quản trị cơ sở dữ liệu quan hệ và MongoDB:
RDBMS MONGODB

Database Database

Table Collection

Row Document

Column Field

Primary Key Primary Key (mặc định là _id)

Trang 7
II. THỰC HIỆN TẠO CƠ SỞ DỮ LIỆU VÀ THỰC HIỆN CÁC THAO TÁC.
1. Tạo cơ sở dữ liệu :
Có 2 cách để tạo CSDL, bao gồm sử dụng giao diện quản trị và sử dụng câu lệnh
NoSQL.

a) Tạo CSDL với giao diện quản trị :

Sau khi mở chương trình MongoDB, người dùng truy cập cần thực hiện các bước
sau đây trên giao diện quản trị:
Bước 1: Bắt đầu – Nhấn chọn vào dấu “ + ” ở góc trái phía dưới của màn hình.

Bước 2 : Khai báo các thông tin cần thiết vào bảng Create Database, trong đó:
+ Tại Database Name, ta nhập tên của của CSDL muốn tạo.
+ Tại Collection Name, ta nhập tên của một bộ sưu tập trong CSDL muốn tạo.

Bước 3: Kết thúc – Nhấn nút Create Database để hoàn tất việc tạo CSDL.

Trang 8
b) Tạo CSDL với câu lệnh :

Sau khi mở chương trình MongoDB, người dùng truy cập cần thực hiện các bước
sau đây trên giao diện quản trị:
- Bước 1: Mở trình soạn thảo truy vấn
- Bước 2: Xây dựng câu lệnh tạo CSDL theo Cú pháp:
use <database_name>
- Bước 3: Nhấn Enter để hoàn tất việc tạo CSDL.
Ví dụ: Nếu muốn tạo một cơ sở dữ liệu có tên là SV, sử dụng lệnh như sau:

Nếu như thành công thì cmd sẽ trả về "switch to db SV"


* Để xem cơ sở dữ liệu đã chọn hiện tại, sử dụng lệnh: db .

* Để xem tất cả các cơ sở dữ liệu có trong hệ thống , sử dụng lệnh: show dbs .

2. Một số thao tác khác :


2.1. Xóa dữ liệu :
Có 2 cách để xóa CSDL, bao gồm sử dụng giao diện quản trị và sử dụng câu lệnh
NoSQL.
a) Xóa CSDL với giao diện quản trị :
Sau khi mở chương trình MongoDB, người dùng truy cập cần thực hiện các bước
sau đây trên giao diện quản trị:
Bước 1: Bắt đầu – Đặt trỏ vào CSDL muốn xóa.
Bước 2: Nhấn chọn vào biểu tượng xóa.

Trang 9
Bước 3: Khai báo tên CSDL muốn xóa vào bảng Drop Database.

Bước 4: Kết thúc – Nhấn nút Drop Database để hoàn tất việc xóa CSDL.

b) Xóa CSDL với câu lệnh :


Sau khi mở chương trình MongoDB, người dùng truy cập cần thực hiện các bước
sau đây trên giao diện quản trị:
- Bước 1: Mở trình soạn thảo truy vấn
- Bước 2: Xây dựng câu lệnh tạo CSDL theo Cú pháp :
db.dropDatabase()
- Bước 3: Nhấn Enter để hoàn tất việc xóa CSDL.
Ví dụ: Nếu muốn xóa cơ sở dữ liệu có tên là SV, ta sẽ thực hiện như sau:
Đầu tiên, kiểm tra danh sách các cơ sở dữ liệu có sẵn bằng lệnh: show dbs

Trang 10
Nếu muốn xóa cơ sở dữ liệu SV, thì ta dùng lệnh: db.dropDatabase()

Cuối cùng, thử kiểm tra danh sách các cơ sở dữ liệu.

Nếu thấy cơ sở dữ liệu muốn xóa không còn trong danh sách cơ sở dữ liệu thì
việc xóa cơ
sở dữ liệu đã hoàn thành.
2.2. Thêm dữ liệu :
Sau khi mở chương trình MongoDB, người dùng truy cập cần thực hiện các bước
sau đây trên giao diện quản trị:
- Bước 1: Mở trình soạn thảo truy vấn
- Bước 2: Xây dựng câu lệnh thêm dữ liệu theo Cú pháp :
db.Collection_Name.insert(Data)
* Trong đó:
CollectionName là tên của collection chúng ta cần thêm dữ liệu vào.
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).
- Bước 3: Nhấn Enter để hoàn tất việc xóa CSDL.
* 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.
VD1: Thêm mới một dữ liệu vào collection có tên là “NamHocHocKy” :

Nếu như insertIds trả về là 0 tương đương với việc bạn đã thêm thành công một
bản ghi vào trong MongoDB . Ứng với ví dụ trên thì có nghĩa là chúng ta đã thêm
thành công dữ liệu.

Trang 11
VD2: Thêm mới nhiều dữ liệu vào collection có tên là “NamHocHocKy”:

Nếu như tham số insertedIds trả về có 2 giá trị, tức là dữ liệu muốn thêm đã
được thực hiện thành công.

2.3. Cập nhật dữ liệu :


Sau khi mở chương trình MongoDB, người dùng truy cập cần thực hiện các bước
sau đây trên giao diện quản trị:
- Bước 1: Mở trình soạn thảo truy vấn
- Bước 2: Xây dựng câu lệnh cập nhật theo Cú pháp :
db.Collection_Name.update(selection_criteria , update_data)
- Bước 3: Nhấn Enter để hoàn tất việc xóa CSDL.
Ví dụ: Theo dõi Collection có tên “NamHocHocKy” có dữ liệu sau:
Giả sử ta muốn thiết lập “HocKy” mới là '3' cho Document có “HocKy” là '2', ta
thực hiện như sau:

Kiểm tra lại dữ liệu bằng lệnh: db.NamHocHocKy.find( )


* Dữ liệu nhận được sau khi cập nhật:

Trang 12
So sánh với lúc đầu, nếu thấy vị trí cần cập nhật đã thay đổi thành giá trị mong
muốn, thì việc cập nhật dữ liệu đã được hoàn thành.
* Dữ liệu trước khi cập nhật:

2.4. Truy vấn dữ liệu:


a) 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 lệnh find() với Cú pháp:
db.Collection_Name.find()
* Trong đó: CollectionName là tên của collection muốn truy vấn.
Tuy nhiên, khi chỉ sử dụng mỗi phương thức find thì dữ liệu trả về sẽ dưới dạng
object nhưng không theo một cấu trúc nào cả.
Ví dụ: Lấy tất cả dữ liệu có trong collection “NamHocHocKy” của CSDL “SV” :

Trang 13
* 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 Select * from trong SQL.
b) Truy vấn có điều kiện:
Để truy vấn có điều kiện trong MongoDB, ta cũng sử dụng Cú pháp tương tự như
mục a, 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.Collection_Name.find(condition)
Trong đó:
CollectionName là tên của collection muốn truy vấn.
Condition là object chứa mệnh đề điều kiện.
Ví dụ: In tất cả các môn học có số tín chỉ là 3 trong collection “MonHoc” :

c) Truy vấn nhiều điều kiện:


Trong MongoDB cũng có hỗ trợ chúng ta truy vấn nhiều điều kiện trên một lần
khai báo với các toán tử AND, OR giống như trong SQL.
c.1. AND :
Để thực hiện phép toán này thì các bạn chỉ cần thêm các điều kiện cảu câu truy
vấn vào trong object chứa điều kiện vào trong phương thức find.
Ví dụ: Lấy ra môn học mà có số tín chỉ là 2 và mã môn học là 1100003 từ
collection “MonHoc”:

Trang 14
c.2. OR :
Để sử dụng mệnh đề or (hoặc) trong MongoDB thì chúng ta cần phải truyền một
key scope có tên là $or vào làm key chứa mảng các điều kiện hoặc, theo Cú pháp:

db.collectionName.find({
$or : [ {key1: value1}, {key2: value2},
... {keyn: valuen}
] })
Ví dụ: Lấy ra môn học mà có số tín chỉ là 4 hoặc môn học có mã môn học là
1100003 từ collection “MonHoc”:

d) Chọn lọc các trường cần lấy:

Để chọn lọc các trường cần hiển thị ra trong 1 collection thì các bạn sử dụng lệnh
find() với Cú pháp sau:
db.Collection_Name.find(ObjectWhere , ObjectSelect)
Trong đó:

Trang 15
ObjectWhere là object chứa các điều kiện ở các phần trên. Nếu không muốn lọc
thì để một object rỗng vào.
ObjectSelect là obejct chứa các trường dữ liệu cần lấy ra. Mặc định thì nó sẽ lấy
cả _id, nên nếu như bạn không muốn hiển thị _id thì bạn cần thêm _id: 0 vào
object.
Ví dụ: Lấy ra các thông tin sau từ collection “ MonHoc”: mã môn học, tên môn
học.

III. TÌM HIỂU VỀ CÁC TOÁN TỬ SO SÁNH SỬ DỤNG TRONG CÂU TRUY
VẤN.
***Toán tử so sánh (comparison query operators)
Các toán tử sau có thể được sử dụng trong các truy vấn để so sánh các giá trị:
1.$ eq:
Các giá trị bằng nhau (trả về các document trong đó giá trị bằng với một giá trị
được chỉ định)
Cú pháp: {<field>: {$eq: <value> }}
+Hiển thị thông tin mã sinh viên có điểm môn học nào đó bằng 8 điểm.

Trang 16
+Hiển thị thông tin số sinh viên có điểm môn học bằng 8 điểm.

2. $ne:
Các giá trị không bằng nhau (so sánh các giá trị không bằng giá trị được chỉ
định)
Cú pháp: {field: {$ne: value}}
Ví dụ: Hiển thị thông tin sinh viên (MaSinhVien, Ho, Ten) có tên không phải là
“Nam”, “Phương” và sắp xếp theo thứ tự (bỏ qua 10 người đầu tiên)
db.sinhvien.find({Ten:{$ne:"Nam",$ne:"Phương"}},{_id:0,MaSinhVien:1,Ho:1,
Ten:1}).sort({"Ten":1}).skip(10)

3. $gt:
Giá trị lớn hơn giá trị khác (trả về các document trong đó giá trị của trường lớn
hơn một giá trị được chỉ định)
Cú pháp: {field: {$gt: value}}
Ví dụ: Lấy thông tin sinh viên (MaSinhVien, Ho, Ten) có số điểm môn học lớn
hơn 9 điểm và sắp xếp theo tên
db.sinhvien.find({"MonHocDK.Diem":{$gt:9}},
{_id:0,MaSinhVien:1,Ho:1,Ten:1}).sort({"Ten":1})

Trang 17
4. $gte:
Giá trị lớn hơn hoặc bằng một giá trị khác (trả về các document trong đó giá trị
của trường lớn hơn hoặc bẳng 1 giá trị được chỉ định)
Cú pháp: {field: {$gte: value}}
5. $lt:
Giá trị nhỏ hơn giá trị khác (so sánh các giá trị nhỏ hơn giá trị được chỉ định)
Cú pháp: {field: {$lt: value}}
6. $lte:
Giá trị nhỏ hơn hoặc bằng một giá trị khác (so sánh các giá trị nhỏ hơn hoặc
bằng một giá trị được chỉ định)
Cú pháp: {field: {$lte: value}}
Ví dụ:
+Sử dụng $gte và $lte:
Lấy thông tin sinh viên (MaSinhVien, Ho, Ten) có số điểm môn học nằm trong
đoạn từ 8.5 đến 9.5 điểm và sắp xếp theo tên
b.sinhvien.find({"MonHocDK.Diem":{$gte:8.5, $lte: 9.5}},
{_id:0,MaSinhVien:1,Ho:1,Ten:1}).sort({"Ten":1})

+Sử dụng $gte và $lt:


Lấy thông tin sinh viên (MaSinhVien, Ho, Ten) có số điểm môn lớn hơn hoặc
bằng 4 điểm và nhỏ hơn 6 điểm và sắp xếp theo tên
db.sinhvien.find({"MonHocDK.Diem":{$gte:4, $lt: 6.5}},
{_id:0,MaSinhVien:1,Ho:1,Ten:1}).sort({"Ten":1})

Trang 18
7. $in:
Giá trị được so khớp trong một mảng (trả về các document trong đó giá trị nằm
trong mảng được chỉ định)
Cú pháp: {field: { $in: [<value1>, <value2>, ... <valueN> ] } }
Ví dụ:
Lấy thông tin sinh viên (MaSinhVien, Ho, Ten) có số điểm môn là một trong
các điểm (1;2;3;4;5;6) và sắp xếp theo tên
db.sinhvien.find({"MonHocDK.Diem":{$in:[1,2,3,4,5.6]}},
{_id:0,MaSinhVien:1,Ho:1,Ten:1}).sort({"Ten":1})

IV. TÌM HIỂU CÁCH TRUY VẤN DOCUMENT LỒNG NHAU.


*Query on Embedded/Nested Documents
Khi thiết kế dữ liệu kiểu Embedded thì không cần tạo ra nhiều collection để lưu
trữ, mà sẽ lưu trữ tất cả vào một collection.
Ví dụ có collection sinhvien:

Document MonHocDK chứa một array các document trong collection mon_hoc
1. Truy vấn lồng nhau trên một mảng
Sử dụng dấu “.” để kết nối các document embedded với nested document theo
Cú pháp:
“Field.nestedfield”
Hiển thị thông tin mã sinh viên, sinh viên có mã môn học = ‘1700016’

Trang 19
Lưu ý: Nếu bỏ dấu “ ” thì truy vấn không thực hiện được

2.Tìm kiếm các document với nhiều điều kiện cho một field embeded trong
một array của document:
2.1 Sử dụng toán tử so sánh
Bỏ qua 2 sinh viên đầu tiên, hiển thị thông tin các sinh viên có tên: “Nam” và có
điểm số môn học từ 8 đến 10 điểm.

2.2 Sử dụng AND:


Hiển thị thông tin các sinh viên có tên: “Nam” và có mã môn học: ‘1700017’ và
điểm số từ 8 đến 10 điểm.

Trang 20
V.TÌM HIỂU VỀ PHƯƠNG THỨC AGGREGATE VÀ CÁC TOÁN TỬ TRONG
AGGREGATION PIPELINE
Aggregation có thể hiểu là sự tập hợp. Các Aggregation operation xử lý các bản
ghi dữ liệu và trả về kết quả đã được tính toán. Các phép toán tập hợp nhóm các
giá trị từ nhiều Document lại với nhau, và có thể thực hiện nhiều phép toán đa
dạng trên dữ liệu đã được nhóm đó để trả về một kết quả duy nhất. Trong SQL,
count(*) và GROUP BY là tương đương với Aggregation trong MongoDB.
1. Phương thức aggregate() 
Với Aggregation trong MongoDB, bạn nên sử dụng phương thức aggregate().
Cú pháp
Cú pháp cơ bản của phương thức aggregate() là như sau:
>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
Ví dụ
Trong Collection, bạn có dữ liệu Collection Monhoc và Namhochocky

Trang 21
Truy vấn SQL tương đương cho trường hợp trên là select by_user,
count(*) from mycol group by by_user.
Trong ví dụ trên, chúng ta đã nhóm các Document bởi trường by_user và trên mỗi
lần xuất hiện của by_user, giá trị trước đó của tổng sẽ được tăng lên. Có một danh
sách các biểu
2. Khái niệm Pipeline
Trong UNIX, lệnh shell pipeline nghĩa là khả năng để thực thi một hoạt động
trên một số input và sử dụng output như là input cho lệnh tiếp theo, và... MongoDB
cũng hỗ trợ cùng khái niệm pipeline đó trong Aggregation Framework. Có một tập
hợp các giai đoạn có thể có và mỗi giai đoạn đó lấy một tập hợp các Document như
là một input và tạo ra một tập các Document kết quả (hoặc kết quả cuối cùng JSON
Document tại phần cuối của pipeline). Kết quả này, sau đó, sẽ lại được sử dụng cho
giai đoạn tiếp theo …
Các giai đoạn có thể có trong Aggregation Framework là:
 $project: Được sử dụng để chọn một số trường cụ thể từ một Collection.
 $match: Đây là một hoạt động lọc và vì thế nó có thể giảm số Document mà
được cung cấp như là input cho giai đoạn kế tiếp.
 $group: Thực hiện Aggregation thực sự, như đã trình bày ở trên.
 $limit: Giới hạn số Document.
 $unwind: Được sử dụng để chia một Document đang sử dụng mảng thành
nhiều Document. Sử dụng hoạt động này sẽ tạo một số lượng Document cho
bước tiếp theo.

3. $match
$match được dùng để lọc các document theo một điều kiện nào
đó. $match tương tự như WHERE và HAVING trong SQL.
Cú pháp: { $match: { &lt;query&gt; }
Cú pháp query của $match y hệt Cú pháp của read operation query (tương tự
như find()).
Ví dụ:
Lọc TenMH trong Monhoc và HocKy trong Namhochocky

Trang 22
4. $project
$project được dùng để chỉ định các field sẽ xuất hiện trong output document.
Đó có thể là các field đã tồn tại trong input document, hoặc cũng có thể là các field
được tính toán mới. $project tương tự như SELECT trong SQL.
Cú pháp: { $project: { &lt;specification(s)&gt; } }
Trong đó:
specification có thể có các dạng sau:
 _id: <0 or false>: field _id sẽ không xuất hiện trong output document (mặc
định _id luôn xuất hiện trong output document).
 <field X>: <1 or true>: field X sẽ xuất hiện trong output document.
 <field X>: <expression>: field X sẽ được tính toán dựa trên một expression
nào đó.
5. $count
$count mới xuất hiện trong MongoDB version 3.4. $count trả về thêm trong
output một field X chứa tổng số input document.
Cú pháp: { $count: &lt;string&gt; }
Trong đó:
<string> là tên của field X, phải khác rỗng, không được bắt đầu bằng ký tự $ và
không được bao gồm ký tự ..
Ví dụ:

6. $limit 
$limit được dùng để giới hạn số lượng output document. $skip được dùng để
chỉ định số lượng document sẽ bị bỏ qua trong output (tính từ document đầu
tiên). $limit và $skip tương tự như LIMIT và OFFSET trong SQL.
Cú pháp: { $limit: &lt;positive integer&gt; }
Ví dụ:

7. $group
$group được dùng để gom nhóm các input document theo expression _id. Mỗi
nhóm tương ứng với một output document. Trong $group, chúng ta có thể sử dụng
các accumulator expression như $sum, $avg, $max, $min, …
$group tương tự như GROUP BY trong SQL.
Cú pháp:
{
  $group:
    {
      _id: &lt;expression&gt;, // Group By Expression
      &lt;field1&gt;: { &lt;accumulator1&gt; : &lt;expression1&gt; },
Trang 23
      ...
    }
}
Nếu _id được set bằng null, MongoDB sẽ query tất cả các input document.
Ví dụ:
Gom nhóm các Monhoc theo MaMH, đồng thời tính tổng amount của
từng Sotinchi

8. $unwind
$unwind được dùng để phân tách giá trị của một array field trong các input
document. Nếu như array field của một input document có N phần tử thì trong
output sẽ có N document.
Cú pháp: {$unwind: &lt;field path&gt; }
Ví dụ:
Mình sẽ thử áp dụng $unwind với array field MaMH để xem kết quả nó sẽ như
thế nào:

9.$lookup
$lookup cho phép chúng ta thực hiện một phép left outer join giữa hai collection
trong cùng một database. Với mỗi input document, $lookup sẽ thêm một array
field chứa các phần tử matching với collection được join.
Cú pháp:
{

Trang 24
   $lookup:
     {
       from: &lt; collection to join&gt;,
       localField: &lt; field from the input documents&gt;,
       foreignField: &lt;field from the documents of the "from" collection&gt;,
       as: &lt;output array field&gt;
     }
}
 
Trong đó:
 from collection không thể bị shard.
 as có thể có tên bất kỳ, nhưng nếu một field nào đó trong document đã có
 tên như vậy thì giá trị của field đó sẽ bị ghi đè.
Ví dụ:
Mình sẽ join MaMH và Namhochocky để bổ sung thêm thông tin của
Namhochocky trong từng MaMH

10.$sum
Tổng giá trị được xác định từ tất cả Document trong Collection đó
Cú pháp: db.getCollection( ).aggregate([{$group : {_id : "$by_user",
num_tutorial : {$sum : "$likes"}}}])
11.$avg
Tính trung bình của tất cả giá trị đã cho từ tất cả Document trong Collection đó
Cú pháp: db.getCollection( ).aggregate([{$group : {_id : "$by_user",
num_tutorial : {$avg : "$likes"}}}])
12.$min
Lấy giá trị nhỏ nhất của các giá trị từ tất cả Document trong Collection đó
Cú pháp: db.getCollection( ).aggregate([{$group : {_id : "$by_user",
num_tutorial : {$min : "$likes"}}}])
13.$max
Lấy giá trị lớn nhất của các giá trị từ tất cả Document trong Collection đó.

Trang 25
Cú pháp: db.getCollection( ).aggregate([{$group : {_id : "$by_user",
num_tutorial : {$max : "$likes"}}}])

14.$eq 
Trả về các document trong đó giá trị bằng với một giá trị được chỉ định
Cú pháp : { <field>: { $eq: <value> } }
+Hiển thị thông tin mã sinh viên có điểm môn học nào đó bằng 8 điểm.

+Hiển thị thông tin số sinh viên có điểm môn học bằng 8 điểm.

15.$gt 
Trả về các document trong đó giá trị của trường một giá trị được chỉ định
Cú pháp: {field: {$gt: value} }
Hiển thị thông tin Sinh viên (MaSinhVien, Ho,Ten) của sinh viên có chứa chữ “H”
trong tên.

VI. THỰC HIỆN SAO LƯU VÀ PHỤC HỒI DỮ LIỆU


Database SINHVIEN chứa các collection: MONHOC, NAMHOCHOCKY,
SINHVIEN.

Trang 26
Trang 27
Backup database: (sử dụng mongodump)
Thực hiện backup dữ liệu toàn bộ dữ liệu trong database SINHVIEN:
File backup được lưu trữ trong thư mục: backupmongodb1.

Sử dụng Command prompt để thực hiện với thao tác với dữ liệu trên mongodb.

Chọn database SINHVIEN, sau đó show các collection trong database


SINHVIEN:
Thấy được rằng lúc này: database SINHVIEN vẫn chứa 3 collection.

Trang 28
Thực hiện backup dữ liệu collection NAMHOCHOCKY trong database
SINHVIEN:
File backup được lưu trữ trong thư mục: backupmongodb2

Thực hiện xóa collection NAMHOCHOCKY. Sau khi show collections thì
database SINHVIEN chỉ còn 2 collection

Thực hiện restore: (sử dụng mongostore)


Restore database SINHVIEN từ file backup (NAMHOCHOCKY) trong thư mục

Trang 29
backupmongodb2.

Sau khi restore thành công, show collection thì database SINHVIEN hiện tại đã
có 3 collection.

VII. SỬ DỤNG CƠ SỞ DỮ LIỆU SINHVIEN VÀ THỰC HIỆN MỘT SỐ CÂU


TRUY VẤN
1. Tạo cơ sở dữ liệu SinhVien
Tạo database sv và các collection SinhVien, NamHocHocKy, MonHoc

Trang 30
2. Thực hiện một số câu truy vấn
*Lấy thông tin của tất cả sinh viên trong cơ sở dữ liệu sinh viên. Thông tin
hiển thị gồm Mã sinh Viên, Họ, Tên. Sắp xếp tên theo thứ tự tăng dần.
Sử dùng hàm find và sort để thực hiện truy vấn cùng sắp xếp dữ liệu:

Kết quả:

*Lấy thông tin của 5 sinh viên đầu tiên có giới tính là Nam và mã lớp là
‘CNTT08’. Thông tin hiển thị gồm Mã sinh viên, họ, tên, giới tính, mã lớp.
Sử dụng hàm Find kết hợp cùng hàm Limit để truy vấn cùng giới hạn số lượng
sinh viên:

Trang 31
Kết quả:

*Lấy thông tin của sinh viên có Mã sinh viên là “0800007”. Thông tin hiển
thị gồm Mã sinh viên, họ, tên, giới tính.
Sử dụng hàm Find để truy vấn thông tin:

Kết quả:

*Lấy thông tin của những sinh viên có họ bắt đầu là “Nguyễn”. Thông tin
hiển thị gồm Mã sinh viên, họ, tên, giới tính.
Sử dụng hàm Find cùng toán tử $regex để truy vấn:

Kết quả:

Trang 32
*Bỏ qua 5 người đầu tiên, lấy thông tin của những sinh viên có đăng ký
môn học với mã môn học là “1100016”.
Kết hợp hàm Find và Skip để truy vấn:

Kết quả:

*Đếm số lượng sinh viên học ở lớp CNTT08


Sử dụng hàm Find và Count để thực hiện:

Kết quả:

Trang 33
Trang 34

You might also like