Professional Documents
Culture Documents
BỘ GIÁO DỤC VÀ ĐÀO TẠO NGÂN HÀNG NHÀ NƯỚC VIỆT NA2 2 1 1
BỘ GIÁO DỤC VÀ ĐÀO TẠO NGÂN HÀNG NHÀ NƯỚC VIỆT NA2 2 1 1
HỒ CHÍ MINH
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.
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.
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:
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.
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.
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
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.
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:
* Để xem tất cả các cơ sở dữ liệu có trong hệ thống , sử dụng lệnh: show dbs .
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.
Trang 10
Nếu muốn xóa cơ sở dữ liệu SV, thì ta dùng lệnh: db.dropDatabase()
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.
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:
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” :
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”:
Để 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})
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})
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.
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: { <query> }
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: { <specification(s)> } }
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: <string> }
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: <positive integer> }
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: <expression>, // Group By Expression
<field1>: { <accumulator1> : <expression1> },
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: <field path> }
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: < collection to join>,
localField: < field from the input documents>,
foreignField: <field from the documents of the "from" collection>,
as: <output array field>
}
}
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.
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.
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
Trang 29
backupmongodb2.
Sau khi restore thành công, show collection thì database SINHVIEN hiện tại đã
có 3 collection.
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ả:
Kết quả:
Trang 33
Trang 34