Làm việc với MongoDB trong NodeJS

MongoDB là một hệ quản trị cơ sở dữ liệu NoSQL rất phổ biến. Nó rất phù hợp cho các ứng dụng có dữ liệu lớn và tương tác người dùng cao. Với cấu trúc dữ liệu linh hoạt, MongoDB dễ dàng mở rộng và hoạt động nhanh chóng.

Làm việc với MongoDB trong NodeJS là một bài hướng dẫn cơ bản về cách cài đặt, sử dụng và tương tác với MongoDB từ trong dự án NodeJS.

Làm việc với MongoDB trong NodeJS

  • Download và cài đặt MongoDB
  • Các khái niệm trong MongoDB
  • Các công cụ quản trị MongoDB
  • Một số hàm NodeJS dùng để tương tác với MongoDB
  • Tương tác MongoDB từ NodeJS

Download và cài đặt MongoDB

  • Truy cập vào trang https://www.mongodb.com/try/download/community và tải xuống MongoDB.
  • Chạy file cài đặt và nhấp “Next” để tiếp tục.
  • Chọn “I accept the terms…” và nhấp “Next”.
  • Chọn “Complete” và nhấp “Next”.
  • Chọn “Run service…” để chạy MongoDB như một dịch vụ trong máy và nhấp “Next”.
  • Chọn “Install MongoDB Compass” – công cụ quản lý MongoDB trực quan và nhấp “Next”.
  • Nhấp “Install” để tiến hành cài đặt.
  • Nhấp “Finish” để hoàn tất quá trình cài đặt.

Các khái niệm trong MongoDB

1. Database trong MongoDB

Mỗi database trong MongoDB tương tự như database trong MySQL. Một database có tên và chứa nhiều Collection.

2. Collection trong MongoDB

Collection trong MongoDB tương tự như bảng trong MySQL. Mỗi collection có tên và thuộc về một database nhất định. 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 bản ghi trong collection. Mỗi document chứa nhiều field và được nhập theo cú pháp JSON.

4. Field trong Document

Field là cặp name:value trong document. Một document có thể chứa nhiều field và chúng được phân tách bằng dấu phẩy. Số field trong một collection có thể khác nhau.

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ý cơ sở dữ liệu MongoDB trên desktop, nó được cài đặt cùng với MongoDB trên máy tính.
  • Robo 3T: Robo 3T cũng là công cụ trực quan để làm việc với MongoDB. Tương tự như việc sử dụng phpMyAdmin để làm việc với MySQL. Để tải xuống Robo 3T, hãy truy cập trang https://robomongo.org/download.
  • Ngoài ra còn có các công cụ khá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 và nhấp “Connect”.
  • Khi kết nối thành công, cột bên trái sẽ hiển thị thông tin kết nối.

2. Tạo database MongoDB

  • Nhấp nút “Create Database” (xem hình) và nhập tên database cùng với tên collection đầu tiên trong database. Sau đó, nhấp nút “Create Database”.

3. Tạo collection (table)

  • Nhấp nút “+” ở phía sau tên database (xem hình) và nhập tên collection. Sau đó, nhấp nút “Create Collection”.

4. Chèn document

  • Mỗi document là một bản ghi dữ liệu cần lưu trữ. Nhấp vào tên collection và sau đó nhấp “Add Data” -> “Insert Document”.
  • Nhập dữ liệu và nhấp “Insert”.

5. Sao chép document, cập nhật và xóa document

  • Sử dụng các nút tương ứng như trong hình để sao chép, cập nhật hoặc xóa document.

6. Tạo index cho document trong collection

  • Tạo index để sắp xếp các bản ghi nhằm tăng tốc độ tìm kiếm. Nhấp vào tab “Indexes” và sau đó nhấp nút “Create Index”.
  • Chọn field, loại index và nhấp “Create index”.

7. Export document trong collection

  • Nhấp nút “Export” (như trong hình) và chọn “JSON”. Sau đó, nhấp “Export”.

Một số hàm NodeJS dùng để tương tác với MongoDB

1. Chèn document (insert record)

  • Sử 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:

Sử 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:

Sử 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

Sử 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

Sử dụng hàm updateMany để cập nhật nhiều document, updateOne để cập nhật một 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

Sử dụng hàm deleteMany để xóa nhiều document và deleteOne để xóa một 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

Bây giờ, chúng ta sẽ thử tương tác với MongoDB từ dự án NodeJS.

1. Tạo project NodeJS và cài module

Chạy lệnh sau để tạo project:

express -ejs Node_Mongodb

Sau đó, cài đặt các module:

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();
});

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();
});

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();
});

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();
});

8. Select document trong MongoDB và hiển thị 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>
<% } %>

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) ? "Đang hiện" : "Đang ẩn" %></p>

Qua đó, việc làm việc với MongoDB trong NodeJS trở nên đơn giản hơn đúng không? Nó tương tự như khi làm việc với MySQL với những vấn đề tương tự như vậy. Bạn có thể tham khảo thêm tại đây: https://mongodb.github.io/node-mongodb-native/6.3/

Mời bạn tiếp tục thực hành và luyện tập thêm:

  1. Trang hiển thị danh sách loại tin: định dạng cho đẹp.
  2. Tạo form để thêm loại tin mới vào collection loaitin.
  3. Tạo form để cập nhật một loại tin trong collection loaitin.
  4. Tạo chức năng xóa một loại tin trong collection loaitin.
  5. Tạo form để thêm bài viết mới vào collection tin.
  6. Tạo trang hiển thị danh sách các bài viết từ collection tin.

Với những bước trên, bạn đã hiểu cách làm việc với MongoDB trong NodeJS một cách đơn giản. Đừng ngần ngại luyện tập và thử thêm nhé!