Bài 8. Làm việc với MongoDB
MongoDB là hệ quản trị cơ sở dữ liệu NoSQL rất nổi tiếng. Mongo rất thích hợp cho các ứng dụng dữ liệu lớn, tương tác người dùng cao. Cấu trúc data không quá chặt chẽ cho nên dễ dàng mở rộng và chạy nhanh.
Làm việc với MongoDB trong NodeJS là bài hướng dẫn cơ bản về cài đặt , sử dụng và tương tác với mongodb từ trong project NodeJS.
Nội dung chính
- Download và cài đặt mongodb
- Các khái niệm trong mongodb
- Các công cụ quản trị MongoDB
- Quản trị database mongodb với MongoDBCompass
- Một số hàm NodeJS dùng để tương tác với MongoDB
- Tương tác mongodb từ NodeJS
- 1. Tạo project NodeJS và cài module
- 3. Nhúng hàm MongoClient trong module mongodb vào
- 4. Chèn document vào mongodb từ NodeJS:
- 5. Cập nhật document trong mongodb từ NodeJS:
- 6. Cập nhật nhiều document trong mongodb từ NodeJS
- 7. Xóa document trong mongodb từ NodeJS
- 8. Select document trong mongodb và hiện kết quả trong NodeJS
- 9. Select 1 document trong mongodb từ NodeJS
Download và cài đặt mongodb
– Vào https://www.mongodb.com/try/download/community và download
– Chạy file vừa cài đặt rồi nhắp Next trong hình để tiếp tục
– Chọn I accept the terms … rồi nhắp Next
– Chọn Complete rồi nhắp Next
– Chọn Run service… để chạy mongo như là service trong máy rồi nhắp Next
– Chọn Install MongoDB Compass – công cụ trực quan quản lý MongoDB rồi nhắp Next
– Nhắp Install để cài đặt
– Nhắp Finish để kết thúc
Các khái niệm trong mongodb
1. Database trong mongodb
Mỗi database trong mongodb giống database trong Mysql. Một database có 1 tên và là kho chứa nhiều Collection.
2. Collection trong mongodb
Collection trong mongodb giống như table trong Mysql. Mỗi collection có 1 tên và đặt trong 1 database nào đó. Khi tạo collection, không cần phải khai báo các cột.
3. Document trong mongodb
Document là các record trong collection. Mỗi document gồm nhiều field , được nhập theo cú pháp json.
4. Field trong document
Field là từng cặp name:value trong document. Một document có nhiều field, cách nhau bởi dấu phẩy. Với các document trong 1 collection thì số field có thể khác nhau.
{"idLoai":1,"tenLoai":"Nghệ thuật sống","thuTu":1,"anhien":false}
{"idLoai":10,"tenLoai":"Thám hiểm","anhien":true}
5. Các kiểu dữ liệu trong MongoDB
MongoDB hỗ trợ các kiểu dữ liệu sau: string, double, int, date, boolean, ObjectID, array…
Các công cụ quản trị MongoDB
MongodbCompass: là công cụ quản lý hệ CSDL MongoDB trên desktop, công cụ này được cài kèm theo khi bạn cài đặt MongoDB vào máy tính.
Robo 3T: Robo 3T cũng là công cụ trực quan để làm việc với MongoDB. Giống như dùng phpmyadmin để làm việc với MySQL vậy. Để download Robo 3T, vào trang https://robomongo.org/download
Ngoài ra còn có các công cụ như Umongo, MongoExplorer, RockMongo…
Quản trị database mongodb với MongoDBCompass
1. Kết nối mongodb trên máy local
– Mở MongoDB Compass => nhắp Connect
– Khi kết nối thành công, cột trái sẽ hiện thông tin kết nối như sau:
2. Tạo database mongodb
Nhắp nút Create Database (xem hình trên) rồi nhập tên Database + nhập tên collection đầu tiên trong database rồi nhắp nút Create Database
Kêt quả tạo:
3. Tạo collection (table)
Nhắp nút + ở phía sau tên database (xem hình trên) rồi nhập tên collection , rồi nhắp nút Create Collection
4. Chèn document
Mỗi document là 1 record dữ liệu cần lưu. Bạn nhắp tên collection rồi nhắp Add Data ==> Insert Document
Rồi nhập dữ liệu vào , xong nhắp nít Insert
5. Clone document , cập nhật, xóa document
Nhắp các nút tương ứng như trong hình dưới
6. Tạo index cho documents trong collection
Tạo index để sắp xếp sẵn các record nhằm phục vụ tìm kiếm cho nhanh chóng. Thực hiện bằng cách nhắp tab Indexs rồi nhắp nút Create Index
Sau đó chọn field , kiểu Index và nhắp nút Create index
7. Export documents trong collection
– Nhắp nút Export như hình dưới
– Chọn JSON rồi nhắp nút Export
Một số hàm NodeJS dùng để tương tác với MongoDB
1. Chèn document (insert record)
Dùng hàm insertOne
db.people.insertOne( { user_id: "bcd001", age: 45, status: "A" })
// INSERT INTO people(user_id, age, status) VALUES ("bcd001", 45, "A")
2. Chọn document (select records)
a. Chọn tất cả các document trong collection
Dùng hàm find như sau
db.people.find()
~ SELECT * FROM people
b. Chọn các document trong collection theo điều kiện
Dùng hàm find với tham số là điều kiện chỉ ra
db.people.find( { status: "A" } )
~ SELECT * FROM people WHERE status = "A"
db.people.find( { status: "A", age: 50 } )
~ SELECT * FROM people WHERE status = "A" AND age = 50
db.people.find( { $or: [ { status: "A" } , { age: 50 } ] } )
~ SELECT * FROM people WHERE status = "A" OR age = 50
db.people.find( { user_id: /bc/ } )
db.people.find( { user_id: { $regex: /bc/ } } ) ~ SELECT * FROM people WHERE user_id like "%bc%"
3**. Đếm các document trong collection**
Dùng hàm count để đếm
db.people.count( { user_id: { $exists: true } } )
db.people.find( { user_id: { $exists: true } } ).count()
~ SELECT COUNT(user_id) FROM people
4. Cập nhật document trong collection
Dùng hàm updateMany để cập nhật nhiều, updateOne để cập nhật 1 document
db.people.updateMany( { age: { $gt: 25 } }, { $set: { status: "C" } } )
~ UPDATE people SET status = "C" WHERE age > 25
db.people.updateMany( { status: "A" } , { $inc: { age: 3 } } )
~ UPDATE people SET age = age + 3 WHERE status = "A"
5. Xóa document trong collection
Dùng hàm deleteMany để xóa nhiều, hàm deleteOne để xóa 1 document.
db.people.deleteMany( { status: "D" } )
~ DELETE FROM people WHERE status = "D"
db.people.deleteMany({})
~ DELETE FROM people
Tương tác mongodb từ NodeJS
Giờ là lúc chúng ta thực tập thử. Để chọn dữ liệu, thêm, sửa , xóa dữ liệu trong mongodb từ trong project NodeJS.
1. Tạo project NodeJS và cài module
Chạy lệnh tạo project:
express --ejs Node_Mongodb
Cài đặt các module vào project: Mở command line rồi chuyển vào folder project gõ lệnh:
npm install
npm install mongodb
3. Nhúng hàm MongoClient trong module mongodb vào
//index.js
const { MongoClient } = require("mongodb");
4. Chèn document vào mongodb từ NodeJS:
// routes/index.js
router.get("/chenRecord", async (req, res) => {
const uri = "mongodb://localhost:27017";
const client = new MongoClient(uri);
await client.connect();
console.log('Kết nối thành công đến server');
const db = client.db('tintuc');
let doc1 = { "idLoai":10, "tenLoai": "Khoa học","thuTu": 10, "anhien":false };
const loaitin = db.collection('loaitin');
const insertResult = await loaitin.insertOne(doc1);
res.status(200).send('Đã chèn xong . InsertedID= ' + insertResult.insertedId);
client.close();
});
Test: xem trong trình duyệt http://localhost:3000/chenRecord sẽ thấy thông báo chèn thành công.
5. Cập nhật document trong mongodb từ NodeJS:
//routes/index.js
router.get("/capnhat", async (req, res) => {
var uri = "mongodb://localhost:27017";
const client = new MongoClient(uri);
await client.connect();
console.log('Kết nối thành công đến server');
const db = client.db('tintuc');
const loaitin = db.collection('loaitin');
let myquery = { thuTu: 10 };
let values = { $set: {"tenLoai": 'Đời sống', "thuTu": 15 } };
const kq = await loaitin.updateOne(myquery, values);
console.log("kq =", kq)
res.status(200).send('Đã cập nhật xong ' + kq. matchedCount + ' dòng' );
client.close();
});
Test: xem trong trình duyệt http://localhost:3000/capnhat sẽ thấy thông báo cập nhật thành công.
6. Cập nhật nhiều document trong mongodb từ NodeJS
//routes/index.js
router.get("/capnhatn", async (req, res) => {
const uri = "mongodb://localhost:27017";
const client = new MongoClient(uri);
await client.connect();
console.log('Kết nối thành công đến server');
const db = client.db('tintuc');
const loaitin = db.collection('loaitin');
let myquery = { thuTu: { $lt: 5 } };
let values = { $set: {thuTu: 1, } };
const kq = await loaitin.updateMany(myquery, values);
console.log("kq =", kq)
res.status(200).send('Đã cập nhật xong ' + kq. matchedCount + ' dòng' );
client.close();
});
Test: xem trong trình duyệt http://localhost:3000/capnhatn sẽ thấy thông báo cập nhật thành công.
7. Xóa document trong mongodb từ NodeJS
// routes/index.js
router.get("/xoaRecord", async (req, res) => {
const uri = "mongodb://localhost:27017";
const client = new MongoClient(uri);
await client.connect();
console.log('Kết nối thành công đến server');
const db = client.db('tintuc');
const loaitin = db.collection('loaitin');
let myquery = {"thuTu": 15 } ;
const kq = await loaitin.deleteOne(myquery);
res.status(200).send('Đã xóa xong ' + kq. deletedCount + ' dòng' );
client.close();
});
Test: xem trong trình duyệt http://localhost:3000/xoaRecord sẽ thấy thông báo xóa thành công.
8. Select document trong mongodb và hiện kết quả trong NodeJS
// routes/index.js
router.get("/layRecord", async (req, res) => {
let uri = "mongodb://localhost:27017";
const client = new MongoClient(uri);
await client.connect();
console.log('Kết nối thành công đến server');
const db = client.db('tintuc');
const loaitin = db.collection('loaitin');
let myquery = {} ;
const arr = await loaitin.find(myquery).toArray();
client.close();
res.render("loaitin",{listloaitin:arr});
});
Tạo file views/loaitin.ejs
<h1>Danh sách loại tin</h1>
<% for (let lt of listloaitin) {%>
<p> <%=lt.tenLoai%></p>
<% } %>
Test: xem trong trình duyệt http://localhost:3000/layRecord sẽ thấy dữ liệu hiện ra
9. Select 1 document trong mongodb từ NodeJS
// routes/index.js
router.get("/layRecord/:id", async (req, res) => {
let id= parseInt(req.params.id);
let uri = "mongodb://localhost:27017";
const client = new MongoClient(uri);
await client.connect();
console.log('Kết nối thành công đến server');
const db = client.db('tintuc');
const loaitin = db.collection('loaitin');
let myquery = { idLoai:id };
let data = await loaitin.findOne(myquery);
res.render("chitietloai",{loaitin:data});
client.close();
})
Tạo file views/chitietloai.ejs và code
<h1>Chi tiết một loại tin</h1>
<p> Tên loại: <%=loaitin.tenLoai%></p>
<p> Thứ tự : <%=loaitin.thuTu%></p>
<p> Ẩn hiện: <%=(loaitin.anHien==true)?"Đamg hiện":"Đang ẩn"%></p>
Test: xem trong trình duyệt http://localhost:3000/layRecord/1 sẽ thấy dữ liệu hiện ra
Mời bạn luyện tập thêm
- Trang hiện danh sách loại tin : định dạng cho đẹp
- Tạo form thêm loại tin để thêm loại tin mới vào collection loaitin
- Tạo form cập nhật 1 loại tin vào collection loaitin
- Tạo chức năng xóa 1 loại tin trong collection loaitin
- Tạo form thêm tin để thêm tin mới vào collection tin
- Tạo trang hiện danh sách các tin từ collection tin
Như vậy, làm việc với MongoDB trong NodeJS cũng đơn giản phải không nào. Cũng những vấn đề và giải quyết tương tự như khi làm việc với MySql thôi. Bạn có thể tham khảo thêm tại link sau: https://mongodb.github.io/node-mongodb-native/6.3/