Xin chào các bạn! Trong series bài viết "Những gì mình biết về MongoDB", chúng ta đã tìm hiểu về một NoSQL DB rất phổ biến là MongoDB. Trong bài viết này, mình sẽ chia sẻ với các bạn cách cài đặt MongoDB dạng standalone và một số thao tác cơ bản với MongoDB như tạo database, tạo collection, thêm/sửa/xóa dữ liệu cơ bản.
Cài đặt MongoDB trên Ubuntu 20.04
Đầu tiên, chúng ta sẽ cài đặt MongoDB 6.0 Community Edition trên Ubuntu 20.04 LTS Focal. Quá trình cài đặt khá đơn giản, bạn chỉ cần làm theo các bước sau:
Bước 1: Thêm key cho repo phục vụ cài đặt MongoDB
wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add -
Kết quả trả về "OK" là thành công. Nếu có lỗi, bạn có thể thực hiện thêm bước sau và sau đó thử lại bước trên:
sudo apt-get install -y gnupg wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add -
Bước 2: Thêm key cho repo phục vụ cài đặt MongoDB
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list
Bước 3: Cập nhật lại repo local
sudo apt update -y
Bước 4: Cài đặt gói MongoDB
sudo apt-get install -y mongodb-org
Nếu bạn cài đặt bằng gói trên OS, hãy đánh dấu gói cài đặt này không tự động cập nhật khi thực hiện update repo bằng cách sau:
echo "mongodb-org hold" | sudo dpkg --set-selections echo "mongodb-org-database hold" | sudo dpkg --set-selections echo "mongodb-org-server hold" | sudo dpkg --set-selections echo "mongodb-mongosh hold" | sudo dpkg --set-selections echo "mongodb-org-mongos hold" | sudo dpkg --set-selections echo "mongodb-org-tools hold" | sudo dpkg --set-selections
Khởi chạy MongoDB
Trước khi khởi chạy MongoDB, cần lưu ý về cấu hình ulimit. Bạn cần set giá trị ulimit cho max-open-files
tối thiểu là 64000, nếu không service mongod sẽ báo lỗi. Giá trị ulimit được set theo từng user của OS, do đó cần set đúng với user dùng để chạy MongoDB.
Khi cài đặt bằng package manager như dùng apt trên Ubuntu như trên, giá trị ulimit đã được set tự động, bạn có thể kiểm tra lại như sau:
Bước 1: Kiểm tra PID của mongod
root@mongodb-standalone:/etc/systemd# ps -ef |grep mongod |grep -v grep mongodb 475 1 0 14:59 ? 00:00:04 /usr/bin/mongod -config /etc/mongod.conf
Bước 2: Kiểm tra các giá trị ulimit của process trên (trong trường hợp này PID=475)
root@mongodb-standalone:/etc/systemd# cat /proc/475/limits Limit Soft Limit Hard Limit Units Max cpu time unlimited unlimited seconds Max file size unlimited unlimited bytes Max data size unlimited unlimited bytes Max stack size 8388608 unlimited bytes Max core file size 0 unlimited bytes Max resident set unlimited unlimited bytes Max processes 64000 64000 processes Max open files 64000 64000 files Max locked memory unlimited unlimited bytes Max address space unlimited unlimited bytes Max file locks unlimited unlimited locks Max pending signals 7837 7837 signals Max msgqueue size 819200 819200 bytes Max nice priority 0 0 Max realtime priority 0 0 Max realtime timeout unlimited unlimited us
Chúng ta thấy giá trị của tham số "Max open files" đã được set là 64000.
Tiếp theo, để chạy MongoDB, chúng ta cần kiểm tra và tùy biến các tham số cấu hình (nếu muốn) và sau đó bắt đầu MongoDB:
sudo systemctl daemon-reload sudo systemctl enable mongod sudo systemctl start mongod
Kết quả khi MongoDB start thành công sẽ như sau:
ubuntu@mongodb-standalone:~$ sudo service mongod status ● mongod.service - MongoDB Database Server Loaded: loaded (/lib/systemd/system/mongod.service; enabled; vendor preset: enabled) Active: active (running) since Sat 2023-03-18 14:59:01 UTC; 30min ago Docs: https://docs.mongodb.org/manual Main PID: 475 (mongod) Memory: 229.2M CGroup: /system.slice/mongod.service └─475 /usr/bin/mongod -config /etc/mongod.conf
Bắt đầu sử dụng MongoDB
Lúc này, MongoDB đã được start và bạn có thể kết nối vào database bằng cách chạy lệnh mongosh trên máy chủ cài MongoDB.
ubuntu@mongodb-standalone:~$ mongosh Current Mongosh Log ID: 6415d80bfe9ee8d719c45af1 Connecting to: mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+1.8.0 Using MongoDB: 6.0.5 Using Mongosh: 1.8.0 For mongosh info see: https://docs.mongodb.com/mongodb-shell/ test>
Ngay bây giờ, chúng ta đã kết nối thành công vào MongoDB và mặc định sẽ kết nối vào database có tên là "test".
Trước khi chúng ta bắt đầu, cần nhắc lại một số khái niệm trong MongoDB sẽ khác với các khái niệm trong các hệ quản trị cơ sở dữ liệu quan hệ. Trong MongoDB, cấu trúc tổ chức sẽ là: database -> collection -> document -> field.
Tạo mới database trong MongoDB với mongosh
Khi lần đầu kết nối vào MongoDB, chúng ta sẽ được kết nối vào một database trắng có tên là "test". Để xem danh sách các database có trong hệ thống, ta sử dụng lệnh:
test> show dbs admin 40.00 KiB config 48.00 KiB local 72.00 KiB
Lưu ý rằng db "test" không được liệt kê trong danh sách.
Để tạo mới một database, ta sử dụng lệnh use [tên-database]
. Ví dụ, để tạo database mới có tên là "demo", ta thực hiện như sau:
test> use demo
Với lệnh trên, một database trắng có tên là "demo" sẽ được tạo ra và chúng ta sẽ tự động chuyển sang database "demo" để thao tác.
Tạo collection mới trong database
Có 2 cách để tạo collection trong MongoDB:
- Tạo bằng lệnh
createCollection
- Tạo bằng cách thêm dữ liệu vào collection (collection sẽ được tạo nếu nó chưa tồn tại)
Tạo collection bằng lệnh createCollection
Ta có thể tạo một collection mới có tên là "staff" bằng lệnh sau:
demo> db.createCollection("staff")
Tạo collection bằng lệnh insertOne
Ta cũng có thể tạo collection bằng cách thêm dữ liệu vào. Collection sẽ tự động được tạo nếu nó chưa tồn tại. Ví dụ, để thêm một document vào collection "staff", ta thực hiện như sau:
demo> db.staff.insertOne({name: "Trinh Quoc Viet", age: "18", gender: "male", cert: ["AWS", "Azure"] })
Thêm dữ liệu vào collection
Để thêm một document vào collection, ta sử dụng lệnh insertOne
.
Ví dụ, để thêm một staff mới có tên "Nguyen Hoang Anh", tuổi 21, giới tính nam, chứng chỉ "GCP" và "Azure", ta sẽ thực hiện như sau:
demo> db.staff.insertOne({name: "Nguyen Hoang Anh", age: "21", gender: "male", cert: ["GCP", "Azure"] })
Để thêm nhiều document vào collection, ta sử dụng lệnh insertMany
:
demo> db.staff.insertMany([ { name: "Trinh Quoc Viet", age: "18", gender: "male", cert: ["AWS", "Azure"] }, { name: "Nguyen Van Anh", age: "20", gender: "female", cert: ["AWS", "CKA", "CKAD"] } ])
Truy vấn dữ liệu trong collection (hàm find
)
Trong MongoDB, chúng ta sử dụng hàm find
để truy vấn dữ liệu từ collection. Hàm find
có thể nhận một query object để lọc dữ liệu. Nếu không có điều kiện lọc, nó sẽ trả về tất cả document của collection.
Sử dụng find()
Ví dụ, để lấy tất cả staff trong collection "staff", ta thực hiện như sau:
demo> db.staff.find()
Sử dụng findOne()
Hàm findOne()
trả về document đầu tiên tìm thấy và có thể nhận một query object làm điều kiện lọc. Nếu không có điều kiện lọc, nó sẽ trả về document đầu tiên trong collection.
demo> db.staff.findOne()
Lọc dữ liệu Chúng ta có thể lọc dữ liệu theo các điều kiện. Ví dụ, để lọc các staff nam trong collection "staff", ta thực hiện như sau:
demo> db.staff.find({"gender": "male"})
Lọc field cần lấy kết quả bằng projection Đôi khi chúng ta chỉ cần lấy ra một số field cần thiết từ document. Để làm điều này, ta sử dụng tham số thứ hai trong hàm find
gọi là projection
. Ví dụ, để lấy ra thông tin tên và chứng chỉ của các staff nam, ta thực hiện như sau:
demo> db.staff.find({"gender": "male"}, {name: 1, cert: 1})
Update dữ liệu trong collection
Để update dữ liệu trong collection, chúng ta sử dụng hàm updateOne()
hoặc updateMany()
. Cả hai hàm này đều nhận một query làm điều kiện truy vấn để chọn ra các document cần update.
Hàm updateOne()
Hàm updateOne()
sẽ update document đầu tiên tìm thấy thỏa mãn điều kiện truy vấn. Ví dụ, để update tuổi của các staff nam thành 20, ta thực hiện như sau:
demo> db.staff.updateOne({"gender": "male"}, {$set: { "age": 20 }})
Hàm updateMany()
Hàm updateMany()
sẽ update toàn bộ các document thỏa mãn điều kiện truy vấn. Ví dụ, để update tuổi của tất cả staff nam thành 25, ta thực hiện như sau:
demo> db.staff.updateMany({"gender": "male"}, {$set: { "age": 25 }})
Xóa dữ liệu trong collection
Cũng tương tự như lệnh insert hay update, MongoDB cũng có hai hàm delete là deleteOne()
và deleteMany()
. Cả hai hàm này đều có thể nhận một query làm điều kiện lọc.
Ví dụ xóa tất cả staff nữ
demo> db.staff.deleteOne({"gender": "female"})
Ví dụ xóa toàn bộ staff nam
demo> db.staff.deleteMany({"gender": "male"})
Một số thao tác khác với db và collection
Liệt kê danh sách collection trong db
db.getCollectionNames()
Xóa một collection
db.collection_name.drop() db.staff.drop()
Xóa một database
db.dropDatabase()
Hy vọng với bài viết này, bạn đã có thể cài đặt MongoDB và thực hiện các thao tác cơ bản với MongoDB. Nếu bạn thấy bài viết hữu ích, hãy ủng hộ bằng cách upvote để mình có động lực viết bài tiếp theo. Hẹn gặp mọi người ở phần tiếp theo!