Cơ sở dữ liệu phi quan hệ MongoDB (NoSQL)

Mục lục- Giới thiệu tổng quan về MongoDB

  • Đặc điểm của MongoDB
  • Tải về và cài đặt
  • Công cụ trực quan hóa
  • Sử dụng cơ bản MongoDB
  • Thao tác dữ liệu
  • Kiểu dữ liệu

Giới thiệu tổng quan về MongoDB

# NoSQL là khái niệm chung cho các cơ sở dữ liệu phi quan hệ
NoSQL (NoSQL = Not Only SQL), có nghĩa là "không chỉ SQL", là một phong trào cách mạng cơ sở dữ liệu hoàn toàn mới. Ý tưởng này đã được đưa ra từ sớm và đến năm 2009 thì phát triển mạnh mẽ. Những người ủng hộ NoSQL đề xướng việc sử dụng lưu trữ dữ liệu phi quan hệ, so với việc áp dụng rộng rãi các cơ sở dữ liệu quan hệ truyền thống, khái niệm này mang lại một tư duy hoàn toàn mới.

MongoDB được viết bằng ngôn ngữ C++, là một hệ thống cơ sở dữ liệu mã nguồn mở dựa trên lưu trữ tệp phân tán. Được thiết kế nhằm cung cấp giải pháp lưu trữ dữ liệu hiệu suất cao, có khả năng mở rộng cho ứng dụng WEB. Trong trường hợp tải cao, việc thêm nhiều nút hơn có thể đảm bảo hiệu suất máy chủ.

MongoDB là sản phẩm nằm giữa cơ sở dữ liệu quan hệ và phi quan hệ, là cơ sở dữ liệu phi quan hệ có chức năng phong phú nhất và giống cơ sở dữ liệu quan hệ nhất.

MongoDB lưu trữ dữ liệu dưới dạng tài liệu (document), cấu trúc dữ liệu bao gồm các cặp khóa-giá trị (key=>value). Tài liệu MongoDB tương tự như đối tượng JSON. Giá trị trường có thể chứa các tài liệu khác, mảng và mảng tài liệu.

Website chính thức: https://www.mongodb.com/

Đặc điểm của MongoDB

MongoDB là cơ sở dữ liệu lưu trữ theo tài liệu, thao tác khá đơn giản và dễ dàng.

Khi tải tăng lên (cần không gian lưu trữ lớn hơn và khả năng xử lý mạnh hơn), nó có thể được phân bố trên các nút khác trong mạng máy tính, đây gọi là sharding.

Mongo hỗ trợ biểu thức truy vấn phong phú. Lệnh truy vấn sử dụng định dạng JSON, có thể dễ dàng truy vấn các đối tượng và mảng lồng nhau trong tài liệu.

MongoDB hỗ trợ nhiều ngôn ngữ lập trình: RUBY, PYTHON, JAVA, C++, PHP, C# và nhiều ngôn ngữ khác.
    
MongoDB cho phép thực thi script ở phía server, bạn có thể viết hàm bằng Javascript, thực thi trực tiếp ở phía server, hoặc lưu định nghĩa hàm ở phía server để lần sau gọi trực tiếp.   

Bạn có thể thiết lập chỉ mục cho bất kỳ thuộc tính nào trong bản ghi MongoDB (ví dụ: FirstName="Sameer", Address="8 Gandhi Road") để đạt tốc độ sắp xếp nhanh hơn.
Bạn có thể tạo bản sao dữ liệu tại chỗ hoặc qua mạng, điều này làm cho MongoDB có khả năng mở rộng tốt hơn.

Tải về và cài đặt

MongoDB là cơ sở dữ liệu lưu trữ theo tài liệu, khi cài đặt trên máy cá nhân nên cân nhắc lưu dữ liệu vào ổ D hoặc E (không phải ổ hệ thống).

Khởi động MongoDB: "mongod" #(sau khi sửa biến môi trường, có thể nhập trực tiếp mongod trong cửa sổ lệnh)
	- Chỉ định thư mục lưu trữ dữ liệu MongoDB: --dbpath="d:/data/db" 
     - Ví dụ: C:\mongodb\bin\mongod --dbpath="d:/data/db" 
            
Cổng mặc định lắng nghe: MongoDB:27017 | Mysql:3306 | Redis:6379
  
Khởi động dịch vụ MongoDB
- net start MongoDB

Dừng dịch vụ MongoDB
- net stop MongoDB

Gỡ bỏ dịch vụ MongoDB (cẩn trọng khi dùng)
- C:\mongodb\bin\mongod.exe --remove

#Hệ thống win10 thêm biến môi trường            

Công cụ trực quan hóa

nosqlbooster khuyến nghị, có thể tự tìm kiếm và tải về (miễn phí)

Sử dụng cơ bản MongoDB

Khởi động MongoDB
mongod khởi động dịch vụ MongoDB cổng mặc định 27017
	-- Đường dẫn mặc định lưu trữ tệp cơ sở dữ liệu: C:/data/db hoặc /data/db
	-- dbpath="D:/data/db"
mongo khởi động client 
	-- Kết nối mặc định localhost:27017 
        
        
Lệnh MongoDB
	1. show databases xem cơ sở dữ liệu trên đĩa cục bộ
    > show databases
    admin  0.000GB
    local  0.000GB
    
	2. use tên_cơ_sở_dữ_liệu chuyển đổi cơ sở dữ liệu hiện tại
    > use admin
    switched to db admin
    # dùng tên cơ sở dữ liệu không tồn tại tức là tạo cơ sở dữ liệu đó trong bộ nhớ, sử dụng đối tượng không tồn tại tức là tạo đối tượng đó
    
	3. db xem cơ sở dữ liệu hiện tại đang dùng 
    > db
	admin
    
    4. db.tên_bảng tìm bảng cụ thể trong cơ sở dữ liệu
    # db.tên_bảng_không_tồn_tại tức là tạo bảng đó trong cơ sở dữ liệu (trong bộ nhớ), sử dụng đối tượng không tồn tại tức là tạo đối tượng đó

	5. show tables xem bảng trong cơ sở dữ liệu hiện tại trên đĩa
    > show tables
	system.version

Thao tác dữ liệu

1.Thêm 
	db.tên_bảng.insert({})
	db.người_dùng.insert({tên:"Sa Wu Jing",tuổi:66.666,sở_thích:[1,2,3,4,5]})
	db.người_dùng.insert([{},{}])
	
	Cách viết được khuyến nghị chính thức trong phiên bản 3.2:
	db.người_dùng.insertOne({}) thêm một dữ liệu
	db.người_dùng.insertMany([{},{}])	thêm dữ liệu hàng loạt
	
    db.tên_bảng.insert({tên:123}) được công nhận nhưng không khuyến nghị
    kết_quả = db.tên_bảng.insertOne({tên:123}) # thêm một dữ liệu trả về inserted_id
    kết_quả = db.tên_bảng.insertMany([{tên:123},{tên:456}]) # thêm nhiều dữ liệu trả về inserted_ids

2.Tìm kiếm
	db.tên_bảng.find({điều_kiện_tìm_kiếm}) tìm tất cả dữ liệu phù hợp điều kiện
    
	db.người_dùng.find({tên:"Sa Wu Jing"}) tìm kiếm theo điều kiện
    # tìm kiếm điều kiện song song and
	db.tên_bảng.find({đk_tìm_kiếm_1,đk_tìm_kiếm_2})
	db.người_dùng.find({tên:"Sa Wu Jing",tuổi:77}) tìm kiếm điều kiện song song
    
    db.tên_bảng.find({điều_kiện_tìm_kiếm}) # tìm tất cả dữ liệu phù hợp điều kiện
    db.tên_bảng.findOne({điều_kiện_tìm_kiếm}) # tìm dữ liệu đầu tiên phù hợp điều kiện, trả về dữ liệu JSON
	
	$ký_hiệu_so_sánh_dữ_liệu
    # cách dùng db.người_dùng.find({tuổi:{$gt:70}})
	$lt		nhỏ hơn
	$lte	nhỏ hơn hoặc bằng
	$gt		lớn hơn
	$gte	lớn hơn hoặc bằng
	$eq		bằng     # db.người_dùng.find({tuổi:{$gt:70}}) tương đương với db.người_dùng.find({tuổi:70}) (khi dấu hai chấm không hoạt động có thể dùng $eq)
	$ne		không bằng
	

3.Sửa
	db.tên_bảng.update() sửa dữ liệu đầu tiên phù hợp điều kiện
	# Tất cả thay đổi MongoDB đều dựa trên bộ chỉnh sửa
	# $bộ_chỉnh_đề từ khóa
	
	# $từ_khóa:
	db.người_dùng.updateOne({tên:"Gang Dan","sinh_vien.tên":"MPy"},{$set:{"sinh_vien.$.tên":"Anyway"}})
	db.người_dùng.updateOne({tên:"Gou Dan",sở_thích:"uống rượu"},{$set:{"sở_thích.$":"lái xe nhanh"}})
	$ dùng để lưu chỉ số vị trí phần tử phù hợp điều kiện mảng hiện tại
	Mảng hiện tại - ["hút thuốc","uống rượu","lướt web"]
	Phần tử điều kiện - {sở_thích:"uống rượu"}
	Mảng hiện tại - phần tử thứ 2 phù hợp điều kiện, chỉ số là 1
	Giá trị hiện tại của $ là 1
	
	Nếu dùng cách ".chỉ_số" để thao tác mảng: "tên_trường.vị_trí_chỉ_số"
	
	
	Cách chính thức khuyến nghị
	db.người_dùng.updateOne({},{}) sửa dữ liệu đầu tiên phù hợp điều kiện
	db.người_dùng.updateMany({},{}) sửa tất cả dữ liệu phù hợp điều kiện
	
	$set	
	db.người_dùng.update({tuổi:66.666},{$set:{tuổi:44}})
	bắt buộc sửa giá trị trường
	db.người_dùng.update({tên:"Tôn Đại Thánh"},{$set:{tuổi_mới:18}})
	nếu trường không tồn tại thì tạo trường và gán giá trị
	
	$unset
	db.người_dùng.update({tên:"Tôn Đại Thánh"},{$unset:{tuổi_mới:1}})
	xóa trường
	
	$inc
	db.người_dùng.update({tên:"Tôn Đại Thánh"},{$inc:{tuổi:1}})
	tăng giá trị, trước tiên truy xuất dữ liệu gốc, sau đó tăng trên cơ sở dữ liệu gốc
	db.người_dùng.update({tên:"Tôn Đại Thánh"},{$inc:{tuổi:-1}})
	giảm
	
	
	Thao tác đặc biệt cho mảng danh sách
	$push == append
	db.người_dùng.update({tên:"Tôn Đại Thánh"},{$push:{sở_thích:"8"}})
	thêm dữ liệu vào cuối mảng kiểu
	
	$pushAll == extends
	db.người_dùng.update({tên:"Tôn Đại Thánh"},{$pushAll:{sở_thích:[9,10,11,12]}})
	thêm nhiều dữ liệu vào cuối mảng kiểu
	
	$pull == remove()
	db.người_dùng.update({tên:"Tôn Đại Thánh"},{$pull:{sở_thích:"8"}})
	xóa tất cả dữ liệu phù hợp điều kiện
	
	$pullAll
	db.người_dùng.update({tên:"Tôn Đại Thánh"},{$pushAll:{sở_thích:[9,10,11,12]}})
	xóa tất cả dữ liệu phù hợp điều kiện
	
	$pop ~= pop() xóa phần tử đầu tiên hoặc cuối cùng trong mảng
	db.người_dùng.update({tên:"Tôn Đại Thánh"},{$pop:{sở_thích:-1}})
	xóa dữ liệu đầu tiên
	
	db.người_dùng.update({tên:"Tôn Đại Thánh"},{$pop:{sở_thích:1}})
	xóa dữ liệu cuối cùng
	
    '''
    db.tên_bảng.update({điều_kiện_tìm_kiếm},{$bộ_chỉnh_đề:{giá_trị_sửa}}) # được công nhận nhưng không khuyến nghị
    db.tên_bảng.updateOne({điều_kiện_tìm_kiếm},{$bộ_chỉnh_đề:{giá_trị_sửa}}) # sửa dữ liệu đầu tiên phù hợp điều kiện
    db.tên_bảng.updateMany({điều_kiện_tìm_kiếm},{$bộ_chỉnh_đề:{giá_trị_sửa}}) # sửa tất cả dữ liệu phù hợp điều kiện

    $bộ_chỉnh_đề trường:
    $set 	bắt buộc sửa, tạo trường
    $unset 	xóa trường {trường:1}
    $inc 	tăng giá trị {$inc:{tuổi:1/-1}} chỉ có thể tăng không thể giảm

    $bộ_chỉnh_đề mảng danh sách
    $push 		== 		append  #thêm dữ liệu {$push:{sở_thích:6}}
    $pull 		== 		remove  #xóa phần tử {$pull:{sở_thích:6}}
    $pop  		~= 		pop		#xóa phần tử đầu tiên(1) hoặc cuối cùng(-1) {$pop:{sở_thích:1/-1}} 
    $pushAll 	== 		extends	#thêm nhiều phần tử {$pushAll:{sở_thích:[4,5,6,7]}}
    $pullAll	# xóa nhiều phần tử {$pullAll:{sở_thích:[4,5,6,7]}}
	'''

4.Xóa
	db.tên_bảng.remove({điều_kiện_tìm_kiếm}) xóa tất cả dữ liệu phù hợp điều kiện
	db.người_dùng.remove({}) nếu điều kiện rỗng thì xóa tất cả dữ liệu Nguy hiểm!
	
	Cách viết chính thức khuyến nghị:
	db.người_dùng.deleteOne({}) # xóa dữ liệu đầu tiên phù hợp điều kiện
	db.người_dùng.deleteMany({}) # xóa tất cả dữ liệu phù hợp điều kiện Nguy hiểm! Nếu điều kiện rỗng thì xóa tất cả dữ liệu

    db.tên_bảng.remove({điều_kiện_tìm_kiếm}) #được công nhận nhưng không khuyến nghị
    db.tên_bảng.deleteOne({điều_kiện_tìm_kiếm}) # xóa dữ liệu đầu tiên phù hợp điều kiện _id
    db.tên_bảng.deleteMany({điều_kiện_tìm_kiếm})# xóa tất cả dữ liệu phù hợp điều kiện
    
    
5.Lấy dữ liệu Bỏ qua Sắp xếp

Sắp xếp
	db.người_dùng.find({}).sort({tuổi:-1}) ngược
	db.người_dùng.find({}).sort({tuổi:1})	thuận
Bỏ qua
	db.người_dùng.find({}).skip(số_lượng_bỏ_qua) bỏ qua
Lấy dữ liệu
	db.người_dùng.find({}).limit(300) lấy 300 dữ liệu
	nếu số lượng dữ liệu nhỏ hơn 300 thì truy vấn hết
	nếu lớn hơn 300 thì chỉ truy vấn 300

db.người_dùng.find({}).sort({tuổi:-1}).skip(1).limit(2)
    Khi cả 3 từ khóa xuất hiện trong một câu lệnh, thứ tự logic: trước tiên sắp xếp - sau đó bỏ qua - cuối cùng lấy dữ liệu

Phân trang (mỗi trang 2 dữ liệu):
số_lượng = 2
trang = 1
bỏ_qua((trang-1)*số_lượng)
db.người_dùng.find({}).sort({tuổi:-1}).skip((trang-1)*số_lượng).limit(số_lượng) 

1 2 0 1
2 2 2 1
3 2 4 1
4 2 6 1
5 2 8 1

Kiểu dữ liệu

Kiểu dữ liệu MongoDB
	ObjectID : _id hệ thống tự sinh cho Documents
	String: chuỗi ký tự, phải là utf-8
	Boolean: giá trị boolean, true hoặc false (có lỗi tiềm ẩn ~ trong Python lớn của chúng ta True False chữ cái đầu viết hoa)
	Integer: số nguyên (Int32 Int64 bạn chỉ cần biết có Int là đủ, thường dùng Int32)
	Double: số thập phân (không có kiểu float, tất cả số thập phân đều là Double)
	Arrays: mảng hoặc danh sách, nhiều giá trị lưu vào một khóa (list nhé, List trong Python lớn nhé)
	Object: nếu bạn học qua Python, khái niệm này rất dễ hiểu, chính là từ điển trong Python, kiểu dữ liệu này chính là từ điển
	Null: kiểu dữ liệu rỗng, một khái niệm đặc biệt, None Null
	Timestamp: dấu thời gian
	Date: lưu ngày giờ hiện tại định dạng unix (chúng ta thường không dùng kiểu Date này, dấu thời gian có thể đánh bại mọi kiểu thời gian khác)

Thẻ: MongoDB nosql Database document-database non-relational-database

Đăng vào ngày 8 tháng 7 lúc 22:07