Mongoose - Statics methods virtual và middleware là gì? Và khi nào nên sử dụng? DESIGNING AN E-COMMERCE WEBSITE ALICONCON

Nội dung bài viết

Video học lập trình mỗi ngày

Mongoose statics vs methods chắc hẳn những ai bước vào tìm hiểu NoSQL cụ thể là Mongodb thì đã từng nghe qua về hai khái niệm đó. Và hơn nữa đó là virtual và middleware trong mongoose. Trong bài viết này chúng ta hãy đi tìm hiểu và áp dụng những khái niệm đó.

Và tôi nhắc lại nếu như bạn là người mới đến blog của Tips Javascript thì đây là một bài viết nằm trong Series - DESIGNING AN E-COMMERCE WEBSITE ALICONCON và đây là post thứ 2.

Nếu như bạn là đã hiểu một chút về những khái niệm trên thì có thể nâng cao hơn với việc xem video về Statics methods virtual in mongoose - node.js. Hoặc video ở đầu bài viết này.

Statics mongoose

statics are the methods defined on the Model

Statics mongoose là giống methods nhưng bạn được sử dụng trực tiếp mà không cần instance Model trong mongoose. Ví dụ:

var AnimalSchema = mongoose.Schema({
  name: String,
  type: String,
  hasTail: Boolean
})

AnimalSchema.statics.findAnimalsWithATail = function (cb) {
  Animal.find({ hasTail: true }, cb);
};

Chúng ta sẽ sử dụng như sau ở file animal.services như sau:

const Animal = require('AnimalSchema_Model')
//use statics
Animal.findAnimalsWithATail()

Methods Mongoose

Tương tự với Statics thì methods được định nghĩa như sau:

Methods are defined on the document (instance)

Điều đó có nghĩa bạn muốn sử dụng methods mongoose thì bạn phải instance của model đó. Ví dụ:

var AnimalSchema = mongoose.Schema({
  name: String,
  type: String,
  hasTail: Boolean
})

AnimalSchema.methods.findByType = function (cb) {
  return this.model('Animal').find({ type: this.type }, cb);
}

Chúng ta sẽ sử dụng như sau ở file animal.services như sau:

const Animal = require('AnimalSchema_Model')
const _Animal = new Animal() // instance model
//use methods
_Animal.findByType()

Virtual Mongoose

Trong Mongoose có hỗ trợ các Virtual attributes. Virtual attributes là các thuộc tính hỗ trợ khi làm việc với staticsmethods nhưng không được lưu giữ trong Model của Mongoose.

Một ví dụ rất hữu ích.

var AnimalSchema = mongoose.Schema({
  name: String,
  type: String,
  hasTail: Boolean
})

AnimalSchema.virtual('getTime').get(function () {
    return Date.now();
})

// use in statics
AnimalSchema.statics.findAnimalsWithATail = function (cb) {
  const time = this.getTime; // use Virtual
  Animal.find({ hasTail: true }, cb);
};

Khi nào nên sử dụng.

Để có cái nhìn cụ thể, bạn nên xem video: Statics methods virtual in mongoose - node.js

Có thể bạn đã bị missing