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
-
Địa chỉ tải: https://www.mongodb.com/download-center/community
-
Quy trình cài đặt tham khảo: Nhấp vào đây
-
Sửa đổi vị trí lưu trữ cơ sở dữ liệu
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)