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

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


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.

Download và cài đặt mongodb

– Vào https://www.mongodb.com/try/download/community và download

Download mongodb

– 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 rồi nhắp Fill in connection fields individually

– Nhập hostname là localhost và port là 27017 rồi 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

– Nhắp chọn mục Export Full Collection rồi nhắp Select Fields

– Bạn check để chọn các field cần export rồi nhắp Select Output

– Chọn mục JSON rồi nhắp nút Browse để chọn vị trí lưu + tên file, xong nhắp nút Export

Một số lệnh dùng trong MongoDB

1.  Chèn document (insert record)

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

db.people.find() 
~ SELECT * FROM people

b. Chọn các document trong collection theo điều kiện

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%"

c. Đếm các document trong collection

db.people.count( { user_id: { $exists: true } } )

db.people.find( { user_id: { $exists: true } } ).count()   
~ SELECT COUNT(user_id) FROM people

d. Cập nhật nhiều document trong collection theo điều kiện

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"

f. Xóa các document trong collection

db.people.deleteMany( { status: "D" } )  
~ DELETE FROM people WHERE status = "D"

db.people.deleteMany({}) 
~ DELETE FROM people

Sử dụng mongodb trong project NodeJS

1.  Cài đặt module mongodb vào project

Mở command line rồi chuyển vào folder project gõ lệnh:

npm install mongodb

2. Kết nối đến mongodb trên máy cục bộ trong project NodeJS

const mongo = require('mongodb');
const mc = mongo.MongoClient;
const url = "mongodb://localhost:27017/tintuc"; 
mc.connect( url,  function (err, db) { 
    if(err) throw err; 
    // viết code thêm, xóa, sửa tại đây... 
});

Vài ví dụ tương tác với mongodb trong nodejs

Chèn document vào mongodb từ NodeJS:

//routes/index.js
var mongo = require('mongodb');
var MongoClient = mongo.MongoClient;
var url = "mongodb://localhost:27017/";
router.get("/chenRecord", (req, res) => {
    MongoClient.connect(url, function(err, client) {
        var db = client.db("tintuc");
        var doc1 = { "idLoai":5, "tenLoai": "Sức khỏe","thuTu": 15, "anhien":false };
        db.collection("loaitin").insertOne(doc1, function(err, res) {        
            console.log("Đã chèn document");
            client.close();
        });
    });
})

Cập nhật document trong mongodb từ NodeJS:

//routes/index.js
router.get("/capnhat", (req, res) => {
    MongoClient.connect(url, function(err, client) {
        var dbo = client.db("tintuc");
        var myquery = { thuTu: 15 };
        var values = { $set: {"tenLoai": 'Đời sống', "thuTu": 10 } };
        dbo.collection("loaitin").updateOne(myquery, values,  function(err, res) {
          console.log("Da cap nhat");
          client.close();
        });
    });
})

Cập nhật nhiều document trong mongodb từ NodeJS

//routes/index.js
router.get("/capnhatn", (req, res) => {
MongoClient.connect(url, function(err, client) {        
        var dbo = client.db("tintuc");
        var myquery = { anhien: true };
        var newval = { $set: {anhien: false } };
        dbo.collection("loaitin").updateMany(myquery, newval, function(err, res) {
          console.log("Da cap nhat cac record");
          client.close();
        });
    });
})

Xóa document trong mongodb từ NodeJS

//routes/index.js
router.get("/xoaRecord", (req, res) => {
    MongoClient.connect(url, function(err, client) {
        var db = client.db("tintuc");
        var myquery = { _id: mongo.ObjectId("61efa5742dcb04d28d6412a5") };
        db.collection("loaitin").deleteOne(myquery, function(err, obj) {
            console.log("Da xoa record");
            client.close();
        });
    });
})

Select document trong mongodb và hiện kết quả trong NodeJS

//routes/index.js
router.get("/layRecord", (req, res) => {
    MongoClient.connect(url, function(err, client) {
        var db = client.db("tintuc");
        db.collection("loaitin").find({}).toArray(function(err, data) {
            res.render("loaitin",{loaitin:data});            
            client.close();
        });
    });
})

views/loaitin.ejs

<% for (let lt of loaitin) {%>
    <p> <%=lt.tenLoai%></p>
<% } %>

Select 1 document trong mongodb từ NodeJS

router.get("/layRecord/:id", (req, res) => {
    let id= parseInt(req.params.id);   
    MongoClient.connect(url, function(err, client) {
        var db = client.db("tintuc");        
        var myquery = { "thuTu":id };
        db.collection("loaitin").findOne(myquery, function(err, data) {
            res.render("chitietloai",{loaitin:data});
            client.close();
        });
    });
})

views/chitietloai.ejs

<p> Tên loại: <%=loaitin.tenLoai%></p>
<p> Thứ tự : <%=loaitin.thuTu%></p>
<p> Ẩn hiện: <%=loaitin.anhien%></p>

Mời bạn luyện tập

  1. Tạo trang hiện danh sách loại tin và và định dạng cho đẹp
  2. Tạo form thêm loại tin để thêm loại tin mới vào collection loaitin
  3. Tạo form cập nhật 1 loại tin vào collection loaitin
  4. Tạo chức năng xóa 1 loại tin trong collection loaitin
  5. Tạo form thêm tin để thêm tin mới vào collection tin
  6. 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.