MongoDB là một trong những cơ sở dữ liệu mã nguồn mở NoSQL phổ biến nhất được biết bằng C++. Nếu bạn dùng nodejs bạn không nên bõ qua.

Kết nối đến MongoDB với Nodejs dùng mongoose

2021-07-04 2204 lượt xem

Tản mạn mongodb

Điểm khác biệt của mongo và RDBMS

MongoDB là một document database, nó lưu trữ JSON như các object. Thay vì trong RDBMS ( ví dụ mysql, sql server, postgreSQL, ... ) chúng ta có các table thì tương đương với một table chúng ta có Collection. Trong table của RDBMS có nhiều row data và trong row có các column thì bên mongo sẽ có documents trong documents sẽ có các field. 

Nhờ cách tổ chức nosql mà mongo có được hiệu năng cao, có thể đáp ứng cho đa dạng các hệ thống và dễ dàng để scale.

Trước khi nhìn trình bày cách cài đặt trong nodejs mình nói thêm 1 chút về kiểu dữ liệu mongo sẽ sử dụng : 

Kiểu dữ liệu

  • String: String trong MongoDB phải là UTF-8 hợp lệ.
  • Integer: Số nguyên có thể là 32 bit hoặc 64 bit tùy thuộc vào máy chủ của bạn.
  • Boolean
  • Double
  • Min/ Max keys: Loại này được sử dụng để so sánh giá trị đối với các yếu tố thấp nhất và cao nhất BSON.
  • Array
  • Timestamp
  • Object
  • Null
  • Symbol
  • Date
  • Object ID
  • Binary data
  • Code
  • Regular expression

Mongoose là gì?

Mongoose là một lớp mô hình hóa tài liệu đối tượng (ODM) nằm trên đỉnh của Node.Js MongoDB API.  BẠn nên dùng nó vì nhiều lợi ích: 

  1. Mình định nghĩa ra các schema trước và sử dụng. như thế sau này khi muốn xem lại các cấu trúc của collection mình cũng xem được và dễ dàng nâng cấp hơn. 
  2. Trong schema còn có các cú pháp ràng buộc ví dụ required maxlenght, ... 
  3. Khi update có trả về kết quả. điều này sẽ dễ dàng hơn cho lập trình viên.

Cài đặt Mongoose

npm install mongoose dotenv

Mình tạo 1 file dùng cho mục đích gọi kết nối đến mongodb có tên ./app.mongo.connect.js. với nội dung như sau : 

const mongoose = require("mongoose")

// mongoose.set('debug', true)
mongoose.set('useFindAndModify', true)

// CONNECTION EVENTS
// When successfully connected
mongoose.connection.on('connected', function () {
    console.log('Mongoose default connected ' + process.env.DB_MONGO)
});

// If the connection throws an error
mongoose.connection.on('error', function (err) {
    console.log('Mongoose default connection error: ' + err)
});

// When the connection is disconnected
mongoose.connection.on('disconnected', function () {
    console.log('Mongoose default connection disconnected')
});

// When the connection is open
mongoose.connection.on('open', function () {
    console.log('Mongoose default connection is open')
    console.log('===================================')
})


/**
 * hàm `myConnection` để file thực thi app.js hoặc bin/www thực thi connection
 */
module.exports.myConnection = () => {
    console.log(`Mongoose connecting ${process.env.DB_MONGO}`)
    /// connect mongodb
    mongoose.connect(process.env.DB_MONGO, 
        {
            useNewUrlParser: true, 
            useUnifiedTopology: true,
            useCreateIndex: true,
            useNewUrlParser: true
        }
    )
}

Chú ý siêu to siêu khổng lồ: coi sửa lại cái đường dẫn kết nối mongodb nha: 

process.env.DB_MONGO 
// thực ra nó là chuỗi giống vầy : 
// mongodb://127.0.0.1:27017/database_ebudezain_exp

Cái database_ebudezain_exp bạn sửa lại đại đi chứ cũng không cần phải tạo db như RDBMS đâu.

Lệnh require('mongoose') trả về phía trên trả về một đối tượng Singleton. Điều này có nghĩa là lần đầu tiên bạn require('mongoose'), nó tạo ra một lớp Mongoose và trả lại . Trong các cuộc gọi tiếp theo, nó sẽ trả lại cùng một cá thể đã được tạo và trả lại cho bạn lần đầu tiên. Bạn không cần phải lo nó tạo nhiều connect đến db của bạn.

Mình thích khi app được start thì mới connect vào mongo => sau khi thêm file connect ./app.mongo.connect.js  ở trên thì chúng ta cần cho app nodejs có thể chạy hàm myConnection. Nếu bạn dùng express-generator thì bạn vào trong bin/www nhúng thêm dòng này : 

var dbConnect = require('../app.mongo.connect');
var dotenv = require('dotenv') /// thêm dot env vào hệ thống
dotenv.config() /// load file .env

Thực thi file lúc app listen

// server.listen(port); /// comment lại 
server.listen(port,  () => {

  console.log(`server run: http://localhost:${port}`)  
  dbConnect.myConnection()
});

hình ảnh: 

Start app để xem connect thành công không

npm start 

kết quả: 

Ngon lành liền 😄 phần 2 mình hướng đẫn mọi ngừoi dùng schema để làm việc với mongo. 

những tag
bài viết trong chủ đề