Document có các lược đồ động có nghĩa là các document trong cùng một collection không cần phải có cùng một tập hợp các field hoặc structure và các field phổ biến trong document của colle
Trang 1MongoDB là một cơ sở dữ liệu nền tảng chéo, tài liệu cung cấp, hiệu suất cao, tính sẵn sàng cao và khả năng mở rộng dễ dàng MongoDB làm việc trên khái niệm về collection và document.
Database: là một vùng chứa vật lý cho các bộ sưu tập Mỗi cơ sở
dữ liệu đều có tập các tệp riêng trên hệ thống tệp Một máy chủ MongoDB đơn thường có nhiều cơ sở dữ liệu.
Collection: Bộ sưu tập các tài liệu MongoDB Nó tương đương với
một table Một collection tồn tại trong một cơ sở dữ liệu đơn Các collection không thực thi lược đồ (schema) Các document trong collection có thể có các field khác nhau Thông thường, tất cả document trong collection đều có mục đích tương tự hoặc có liên quan.
Document: là tập hợp các cặp key-value Document có các lược
đồ động có nghĩa là các document trong cùng một collection không cần phải có cùng một tập hợp các field hoặc structure và các field phổ biến trong document của collection có thể chứa các loại dữ liệu khác nhau.
Tổng quan về MongoDB
Trang 2Bảng sau đây cho thấy mối quan hệ của thuật ngữ RDBMSvới MongoDB.
Primary Key Primary Key (Default key _id provided by
mongodb itself)
Database Server and Client
Trang 3Ví dụ về Document
Ví dụ sau đây cho thấy cấu trúc document của một trang blog, mà chỉ đơn giản là một cặp giá trị khóa được phân tách bằng dấu phẩy { _id : ObjectId ( 7df78ad8902c )
title : 'MongoDB Overview’ ,
description : 'MongoDB is no sql database’ ,
by : 'tutorials point’ ,
url : 'http://www.tutorialspoint.com’ ,
tags : ['mongodb', 'database', 'NoSQL’],
likes : 100 ,
comments : [ { user :'user1’ ,
message : 'My first comment’ ,
dateCreated : new Date ( 2011 , 1 , 20 , 2 , 15 ),
like : 0 }, { user :'user2’ ,
message : 'My second comments’ ,
dateCreated : new Date ( 2011 , 1 , 25 , 7 , 45 ),
like : 5 } ]
} _id là số thập lục phân 12 byte, đảm bảo tính duy nhất của mọi tài liệu Bạn cóthể cung cấp _id trong khi chèn tài liệu Nếu bạn không cung cấp thì MongoDB
cung cấp một id duy nhất cho mọi tài liệu Trong 12 byte thì 4 byte cho dấu thời gian hiện tại, 3 byte tiếp theo cho id máy, 2 byte tiếp theo cho quá trình id của máy chủ MongoDB và 3 byte còn lại là VALUE gia tăng đơn giản.
Trang 4Ưu điểm của MongoDB
Bất kỳ cơ sở dữ liệu quan hệ nào có thiết kế lược đồ điển hình để cho thấy số lượng bảng và mối quan hệ giữa các bảng này Trong MongoDB, không có khái niệm về mối quan hệ.
Ưu điểm của MongoDB trên RDBMS
• Giản đồ ít hơn - MongoDB là một cơ sở dữ liệu tài liệu trong đó
một bộ sưu tập chứa các tài liệu khác nhau Số lượng các field, nội dung và kích thước của tài liệu có thể khác nhau giữa mỗi tài liệu.
• Cấu trúc của một đối tượng đơn là rõ ràng.
• Không có phép kết (join) phức tạp.
• Khả năng truy vấn sâu MongoDB hỗ trợ các truy vấn động trên các document bằng cách dung ngôn ngữ truy vấn dựa trên tài liệu gần như là mạnh mẽ như SQL.
• Có thể tinh chỉnh.
• Dễ dàng mở rộng quy mô - MongoDB dễ dàng mở rộng.
• Chuyển đổi / ánh xạ các đối tượng ứng dụng đến các đối tượng cơ
sở dữ liệu không cần thiết.
• Sử dụng bộ nhớ trong để lưu trữ bộ làm việc (có cửa sổ), cho phép truy cập dữ liệu nhanh hơn.
Trang 5Tại sao sử dụng MongoDB?
• Lưu trữ theo định hướng tài liệu - Dữ liệu được lưu trữ
dưới dạng tài liệu kiểu JSON
• Chỉ mục trên bất kỳ thuộc tính nào
• Nhân rộng và tính khả dụng cao
• Tự động sao lưu qua nhiều thiết bị khi kích thước tăng
• Truy vấn phong phú
• Cập nhật thay thế nhanh
• Có nhiều hỗ trợ về chuyên môn
Nơi nào sử dụng MongoDB?
• Dữ liệu lớn
• Quản lý và phân phối nội dung
• Cơ sở hạ tầng di động và xã hội
• Quản lý dữ liệu người dùng
• Trung tâm dữ liệu
Trang 6Môi trường MongoDB
Để cài đặt MongoDB trên Windows, trước tiên hãy tảixuống bản phát hành mới nhất của MongoDB từ
https://www.mongodb.org/downloads
MongoDB yêu cầu một thư mục dữ liệu để lưu trữ các tệpcủa nó Vị trí mặc định cho thư mục dữ liệu MongoDB là
c:\data\db Vì vậy, bạn cần tạo thư mục này bằng
Command Prompt Thực thi chuỗi lệnh sau
C:\>md data C:\md data\db
Trang 7Nếu phải cài đặt MongoDB ở một vị trí khác, thì cần chỉ
định một đường dẫn thay thế cho \data\db bằng cách thiết lập đường dẫn dbpath trong mongod.exe Ví dụ ta tạo
đường dẫn tại nơi khác như sau Giả sử thư mục cài đặt
là D:\set up\mongodb
C:\Users\XYZ>d:
D:\>cd "set up"
D:\set up>cd mongodb
D:\set up\mongodb>cd bin
D:\set up\mongodb\bin>mongod.exe dbpath "d:\set up\mongodb\data"
Máy sẽ hiển thị thông báo waiting for connections, cho biết
rằng quá trình mongod.exe đang chạy thành công
Bây giờ để chạy MongoDB, bạn cần mở một dấu nhắc lệnhkhác và đưa ra lệnh sau đây
D:\set up\mongodb\bin>mongo.exe
Trang 8D:\set up\mongodb\bin>mongo.exe
MongoDB shell version: 2.4.6
connecting to: test
Trang 9hiển thị trong ảnh chụp màn hình.
Trang 10Thống kê MongoDB
Để có được số liệu thống kê về máy chủ MongoDB, gõ
lệnh db.stats () trong máy khách MongoDB Điều này sẽ
hiển thị tên cơ sở dữ liệu, số lượng bộ sưu tập (collection)
và tài liệu (documents) trong cơ sở dữ liệu Đầu ra của lệnhđược hiển thị trong ảnh chụp màn hình sau đây
Trang 11Mô hình hóa dữ liệu-MongoDB
Dữ liệu trong MongoDB có một schema.documents linh hoạt trong cùng một bộ sưu tập Chúng không cần phải có cùng một tập các trường (field) hoặc cấu trúc (structure) và các field phổ biến có thể chứa các loại dữ liệu khác nhau.
Một số cân nhắc khi thiết kế Schema trong MongoDB
• Thiết kế lược đồ của bạn theo yêu cầu của người dùng.
• Kết hợp các đối tượng vào một tài liệu nếu sử dụng chúng cùng nhau Nếu không thì tách chúng ra (nhưng chắc chắn không cần phải kết-join).
• Sao chép dữ liệu (nhưng giới hạn) vì không gian đĩa có giá rẻ
so với thời gian tính toán.
• Thực hiện kết trong khi ghi-write, không phải đọc-read.
• Tối ưu hóa lược đồ cho các trường hợp dùng thường xuyên nhất.
• Thực hiện phép gom nhóm phức tạp trong lược đồ.
Trang 12Thí dụ: Giả sử một khách hàng cần thiết kế cơ sở dữ liệu cho blog/trang web của mình và thấy sự khác biệt giữa thiết kế lược đồ RDBMS và MongoDB Website có các yêu cầu sau.
• Mỗi bài đăng (post) có tiêu đề, mô tả và url duy nhất.
• Mỗi bài đăng có thể có một hoặc nhiều thẻ.
• Mỗi bài đăng có tên của nhà xuất bản và tổng số lượt thích.
• Mỗi bài đăng đều có nhận xét do người dùng đưa ra cùng với tên, thông điệp, dữ liệu thời gian và số lượt thích.
• Trên mỗi bài đăng, có thể có không hoặc nhiều nhận xét.
Trong lược đồ RDBMS, thiết kế cho các yêu cầu trên sẽ có tối thiểu
ba bảng.
Trang 13comments : [ { user : 'COMMENT_BY' , message : TEXT ,
dateCreated : DATE_TIME , like : LIKES }, { user : 'COMMENT_BY' , message : TEXT ,
dateCreated : DATE_TIME , like : LIKES } ]
}
Trong khi trong lược đồ MongoDB, thiết kế sẽ có một tập
hợp-collection bài đăng và cấu trúc sau
Vì vậy, trong khi hiển thị dữ liệu, trong RDBMS ta cần phải join ba bảng và trong MongoDB, dữ liệu sẽ chỉ được hiển thị từ một bộ sưu tập-collection.
Trang 14kết-MongoDB - Tạo cơ sở dữ liệu
Lệnh use
MongoDB use DATABASE_NAME được sử dụng để tạo cơ
sở dữ liệu Lệnh sẽ tạo một cơ sở dữ liệu mới nếu nó khôngtồn tại, ngược lại nó sẽ trả về cơ sở dữ liệu hiện có
Cú pháp cơ bản là use DATABASE như sau:
use DATABASE_NAME
Thí dụ
Nếu muốn sử dụng một cơ sở dữ liệu với tên <mydb> ,
thì câu lệnh sẽ như sau:
>use mydb
switched to db mydb
Trang 15Để kiểm tra cơ sở dữ liệu hiện đang sử dụng, ta dùng
Nếu muốn kiểm tra danh sách cơ sở dữ liệu, ta dùng
local 0.78125GB test 0.23012GB
Cơ sở dữ liệu đã tạo (mydb) không có trong danh sách Để
hiển thị cơ sở dữ liệu, thì cần chèn ít nhất một tài document vào đó >db.movie.insert({"name":"tutorials point"})
liệu-> show dbs local 0.78125GB mydb 0.23012GB test 0.23012GB
Trong MongoDB cơ sở dữ liệu mặc định là test Nếu bạn
không tạo bất kỳ cơ sở dữ liệu nào, thì các bộ sưu collection sẽ được lưu trữ trong cơ sở dữ liệu test
Trang 16tập-MongoDB - Drop Database
Lệnh db.dropDatabase () được dùng để xóa cơ sở dữ liệu hiện
Thao tác này sẽ xóa cơ sở dữ liệu đã chọn Nếu chưa chọn cơ sở
dữ liệu nào, thì nó sẽ xóa cơ sở dữ liệu mặc định là 'test'.
Thí dụ: Đầu tiên, xem danh sách các cơ sở dữ liệu có sẵn bằng
Trang 17MongoDB - Create Collection
Phương thức createCollection ()
Dùng lệnh db.createCollection (name, options) để tạo bộ
sưu tập Cú pháp cơ bản như sau:
db.createCollection(name, options)
Trong lệnh, name là tên của bộ sưu tập được tạo
ra Options là tài liệu-document và được dùng để chỉ định
cấu hình của bộ sưu tập-collection.
Options Document (Tùy chọn) Chỉ định các tùy chọn về
kích thước bộ nhớ và lập chỉ mục
Trang 18Tham số Options là tùy chọn, vì vậy chỉ cần chỉ định tên của
collection Sau đây là danh sách các tùy chọn có thể sử dụng
capped Boolean
(Tùy chọn) Nếu đúng, bộ sưu tập có giới hạn Capped collection là một collection kích thước cố định tự động ghi đè các mục cũ nhất của
nó khi nó đạt đến kích thước tối đa Nếu chỉ định
đúng, ta cũng cần chỉ định tham số kích thước.
autoIndexId Boolean (Tùy chọn) Nếu đúng, tự động tạo chỉ mục trên
trường _id Giá trị mặc định là false.
size number
(Tùy chọn) Chỉ định kích thước tối đa tính bằng
byte cho capped collection Nếu capped là true,
thì bạn cũng cần phải xác định field này.
max number (Tùy chọn) Chỉ định số lượng document tối đa
được phép trong capped collection.
Trong khi chèn document, đầu tiên MongoDB kiểm tra kích thước field của capped collection, sau đó nó kiểm tra field tối đa.
Trang 19Ví dụ: Cú pháp cơ bản của phương thức createCollection
() không option như sau: >use test
switched to db test
> db createCollection ( "mycollection" ) { "ok" : 1 }
>
Ta có thể kiểm tra collection đã tạo bằng cách dùng lệnh
show collections >show collections
mycollection system indexes
Ví dụ sau đây cho thấy cú pháp của phương
thức createCollection () với một số option quan trọng
-> db createCollection ( "mycol" , { capped : true , autoIndexId : true ,
size : 6142800 , max : 10000 } ) { "ok" : 1 } >
Trang 20Trong MongoDB, bạn không cần tạo collection MongoDB
tự động tạo collection, khi bạn chèn một số document
>db.tutorialspoint.insert({"name" : "tutorialspoint"})
Trang 21MongoDB - Drop Collection
Ta dùng p hương thức drop () để xóa collection
Thí dụ: Đầu tiên, kiểm tra các collection có sẵn trong cơ sở
dữ liệu mydb không.
Trang 22MongoDB - Datatypes
• String (Chuỗi) - Đây là kiểu dữ liệu được sử dụng phổ biến nhất để
lưu trữ dữ liệu String trong MongoDB phải là UTF-8 hợp lệ.
• Integer (Số nguyên) - kiểu này được sử dụng để lưu trữ giá trị
số Số nguyên có thể là 32 bit hoặc 64 bit tùy thuộc vào máy chủ.
• Boolean - Kiểu này được sử dụng để lưu trữ một giá trị boolean
• Arrays (Mảng) - Loại này được sử dụng để lưu trữ các mảng hoặc
danh sách hoặc nhiều giá trị vào một khóa.
• Timestamp (Dấu thời gian) - loại này hữu ích dùng ghi nhận khi
một tài liệu đã được sửa đổi hoặc thêm vào.
• Object (Đối tượng) - Kiểu dữ liệu này được sử dụng cho các tài
liệu được nhúng.
Trang 23MongoDB – Datatypes (t.t)
• Null - Kiểu này được sử dụng để lưu trữ một giá trị Null.
• Symbol - Kiểu dữ liệu này được sử dụng giống hệt string; tuy
nhiên, nó thường được dành riêng cho các ngôn ngữ sử dụng một loại ký hiệu cụ thể.
• Date - Kiểu dữ liệu này được sử dụng để lưu trữ ngày hoặc
giờ hiện tại theo định dạng thời gian UNIX Bạn có thể chỉ định thời gian ngày của riêng bạn bằng cách tạo đối tượng Date và truyền ngày, tháng, năm vào nó.
• Object ID - Kiểu dữ liệu này được sử dụng để lưu trữ ID của
document.
• Binary data - Kiểu dữ liệu này được sử dụng để lưu trữ dữ
liệu nhị phân.
• Code (Mã) - Kiểu dữ liệu này được sử dụng để lưu mã
JavaScript vào document.
• Regular expression (Biểu thức thông dụng) - Kiểu dữ liệu này
được sử dụng để lưu trữ biểu thức.
Trang 24MongoDB - Insert Document
Phương thức insert () hoặc save () dùng để chèn documentvào collection Cú pháp cơ bản như sau:
>db.COLLECTION_NAME.insert(document)
> db mycol insert ({ _id : ObjectId ( 7df78ad8902c ),
title : 'MongoDB Overview’ ,
description : 'MongoDB is no sql database’ ,
Ở đây mycol là tên collection Nếu collection không tồn tại
trong cơ sở dữ liệu, thì MongoDB sẽ tạo collection này vàsau đó chèn một document vào nó Trong document đượcchèn vào, nếu không chỉ định tham số _id, thì MongoDBgán một ObjectId duy nhất cho document này
Trang 25_id là số thập lục phân 12 byte duy nhất cho mọi documenttrong collection 12 byte được chia như sau:
_id: ObjectId(4 bytes timestamp, 3 bytes machine id,
2 bytes process id, 3 bytes incrementer)
Để chèn nhiều document trong một truy vấn, ta có thểchuyển một mảng các document vào lệnh insert ()
Thí dụ
Trang 26> db post insert (
[ { title : 'MongoDB Overview’ ,
description : 'MongoDB is no sql database’ ,
by : 'tutorials point' , url : 'http://www.tutorialspoint.com’ ,
tags : [ 'mongodb' , 'database' , 'NoSQL' ], likes : 100 }, { title : 'NoSQL Database’ ,
description : "NoSQL database doesn't have tables" ,
by : 'tutorials point' , url : 'http://www.tutorialspoint.com’ ,
tags : [ 'mongodb' , 'database' , 'NoSQL' ], likes : 20 ,
comments : [ { user : 'user1' , message : 'My first comment’ ,
dateCreated : new Date ( 2013 , 11 , 10 , 2 , 35 ),
like : 0 } ] } ]
)
Để chèn document, ta cũng có thể sử dụng db.post.save
(document) Nếu không chỉ định _id trong document thì phương
thức save () sẽ hoạt động giống như phương thức insert () Nếu
chỉ định _id thì nó sẽ thay thế toàn bộ dữ liệu của document chứa _id như được chỉ định trong phương thức save ().
Trang 27MongoDB - Query Document
Chúng ta tìm hiểu cách truy vấn document từ collection MongoDB.
Phương thức find () sẽ hiển thị tất cả các tài liệu theo cách không có
> db mycol find () pretty () { "_id" : ObjectId ( 7df78ad8902c ),
"title" : "MongoDB Overview" ,
"description" : "MongoDB is no sql database" ,
"by" : "tutorials point" ,
Trang 28Truy vấn theo điều kiện (giống where trong RDBMS)
Để truy vấn document dựa trên một số điều kiện cơ sở như sau.
bằng
{<key>:{$gte:<value>}} db.mycol.find({"likes":{$gte:50}}).pretty() where
likes >= 50 Không bằng {<key>:{$ne:<value>}} db.mycol.find({"likes":{$ne:50}}).pretty() where
likes != 50
Trang 29Phép AND trong MongoDB
Cú pháp:
Trong phương thức find () , nếu truyền nhiều khóa tách nhau bởi dấu ',' thì MongoDB xử lý nó bằng điều kiện AND Sau đây là
cú pháp cơ bản của AND
->db.mycol.find( { $and: [ {key1: value1}, {key2:value2} ] } ).pretty()
Ví dụ sau sẽ hiển thị tất cả các tutorials được viết bởi ' tutorials point' và có tiêu đề là ' MongoDB Overview'.
> db mycol find ({ $and :[{ "by" : "tutorials point" },{ "title" : "MongoDB Overview" }]}) pretty ()
{
"_id" : ObjectId ( 7df78ad8902c ), "title" : "MongoDB Overview" ,
"description" : "MongoDB is no sql database" , "by" : "tutorials point" ,
"url" : "http://www.tutorialspoint.com" ,
"tags" : [ "mongodb" , "database" , "NoSQL" ], "likes" : "100"
}
Đối với ví dụ ở trên, tương đương mệnh đề where là "where by =
'tutorials point' AND title='MongoDB Overview’ Ta cũng có thể
truyền bất kỳ số cặp khóa, giá trị nào vào trong mệnh đề find.