Để làm việc với Mongoose sau khi thực hiện connection thì chúng ta sẽ bắt đầu với một Schema. Vậy schema là gì? làm việc như thế nào thì các bạn cùng theo dõi bài viết nhé!

dùng schema để làm việc với mongoose trong nodejs mongodb

2021-07-04 4051 lượt xem

Schemas trong Mongoose

Để làm việc với Mongoose sau khi thực hiện connection thì chúng ta sẽ bắt đầu với một Schema. Model là kết quả từ quá trình compile Schema đã được định nghĩa trước đó. Một instance của model được gọi là document. Model sẽ chịu trách nhiệm chính trong việc đọc và ghi dữ liệu từ database MongoDB.

Bạn tạm hiểu trong cơ sở dữ liệu RDBMS thì bạn phải tạo trước table trong cơ sở dữ liệu thì bên nodejs bạn define ra 1 cấu trức (tạm hiểu là table) trước trong code đó là schema. 

Vậy tóm lại Schema tương đương 1 collection (1 collection tỏng mongo giống với 1 table trong Mysql )

Schema mongoose nodejs chat bảng channel

Mình sẽ đưa ra 1 ví dụ cụ thể trước sau đó mới giải thích thì mọi người sẽ dễ hiểu hơn: 

Đây là schema của Channel trong mongoose: 

const mongoose = require('mongoose'),
    Schema   = mongoose.Schema

const ChannelSchema = new Schema(
    {
        name: {
            type: String,
            required: [true, 'Channel Name is required']
        },
        user: [
            {
                type: Number
            }
        ],
        backup: {
            type: Boolean,
            default: false /// channel xóa thì không xóa hẳn, thông thường là cột delete
        },
        sort: {
            type: Number,
            default: 1
        }
    }, {
    timestamps: true
})

module.exports = mongoose.model("channel", ChannelSchema)

Schema là 1 đối tượng nằm trong package mongoose. Và có thể định nghĩa các kiểu dữ liệu. 

Mỗi key trong object truyền vào class new Schema ví dụ như (name , user, backup,..) sau này sẽ là 1 field của 1 document.  Mỗi value trong object thì phải định nghĩa kiểu dữ liệu cho nó ví dụ String, Number, Boolean, ... và nó có thể lưu dạng 1 key thì là 1 Array luôn như mình lưu key là user nhé 😄 cái này khá hay ho nghen. 

Thì các kiểu dữ liệu để truyền vào đó là các SchemaType của mongoose. Bạn có thể xem ở bài trước mình có nói: Kiểu dữ liệu SchemaType

Sau khi bạn tạo được Schema cụ thể là ChannelSchema, thì để sử dụng được nó bạn cần dùng nó với mục đích là tạo 1 model vào trực tiếp mongodb thực tế. Vậy cú pháp là: 

mongoose.model("channel", ChannelSchema)

 và Bạn cần export ra ngoài để khi nào cần dùng đến thì chỉ cần gọi ra xài thoai 😄 nên cú pháp đầy đủ của nó là : 

module.exports = mongoose.model("channel", ChannelSchema)

Thêm thử 1 record trong mongoose

Sau khi bạn có schema như vậy bạn chỉ cần gọi vào code controller mà thêm sửa hoặc update tuỳ thích. Ví dụ 1 file controller mẫu của mình có dùng thì sẽ code như sau: 

const Channel = require('../models/Channel')
let store = async (req, res) => {
    
    let channelPromise = new Channel({
        name: "thử thêm 1 channel mới",
        user: [ 1, 2 ],
    }) /// khởi tạo data trước khi lưu
    try {
        const channel = await channelPromise.save() /// hàm save để lưu vào db
        console.log( "lưu vào thành công rồi " )
    } catch (error) {
        console.log( "lưu vào thành thất bại rồi " + error.message )
    }
}
module.exports = {
    store,
}

Instance methods trong Mongoose

Khi bạn gọi lệnh save thì mongoose sẽ trả ra 1 object thể hiện (instance).

Đặt tình huống là field backup của mình bình thường là false. Nếu backup = true thì channel đó bị xoá. Mình có nhu cầu tạo cái hàm kiêmr tra nếu backup == false thì xuất thông báo là channel bình thường, nếu true thì xuất thông báo là channel bị xoá => mình tạo cái hàm trong model như sau: 

ChannelSchema.statics.getNotifyChannel = function(){
    
    if( this.backup ){
        /// nếu backup đúng thì channel bị xoá
        return 'channel bị xoá'
    }
    return 'channel bình thường'
}

Rồi ngoài controller muốn lấy notify thì gọi cái fucntion trong cái instance đó ra: 

 

Schema Statics trong Mongoose

Với cách làm ở trên thì chúng ta đang thao tác việc lưu trữ dữ liệu ở controller. Nó khá là lầy lội so với kiến trúc MVC  => nhu cầu tạo 1 function thực thi trong model được tạo ra. Mongoose đã cung cấp cho bạn 1 cách để thực hiện như sau: 

// hàm getChannelAndUpdateByUserId lại là hàm của Model Channel khác với khái niệm statics phía trên
ChannelSchema.methods.getChannelAndUpdateByUserId = async function( id, name ) {

    let channel = await this.find({ user: id })
    /// map dữ liệu rồi lưu vào
    channel.name = name /// channel là thể hiện
    return channel.save(); 
};;

 

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