Static method trong mongoose

Để thêm các static method vào model chúng ta có 2 cách sau:

  • Thêm một function property vào schema.statics
  • Gọi Schema#static() function
// File static.method.js
import mongoose from 'mongoose';

// connect to MongoDB
mongoose.connect('mongodb://localhost/gettingstarted', { useNewUrlParser: true });

const UserSchema = mongoose.Schema({
    email: String,
    password: String,
    fullname: String,
    gender: {
        type: String,
        enum: ['male', 'female', 'other']
    },
    createdAt: {
        type: Date,
        default: Date.now
    },
    note: String
});

// use statics
UserSchema.statics.findByName = function(name) {
    return this.find({fullname: new RegExp(name, 'i') });
}

// use static()
UserSchema.static('findByEmail', function(email) {
    return this.findOne({email});
})

Thực nghiệm

//File static.method.js
// more code
const UserModel = mongoose.model('User', UserSchema);

const insertUser = async (email, password, fullname, gender) => {
    const newUser = new UserModel({
        email, password, fullname, gender
    });
    return await newUser.save();
}


const staticMethod = async () => {
    try {
        await insertUser("email1", "123", "name 1", "male");
        await insertUser("email2", "123", "name 2", "male");
        await insertUser("email3", "123", "name 3", "female");

        console.log("findByName")
        console.log(await UserModel.findByName("name"));
        console.log("------------------------------------")
        console.log("findByEmail")
        console.log(await UserModel.findByEmail("email2"));
    } catch(err) {
        console.log(err);
    }
}

staticMethod();

Run

  • MacOS: ./node_modules/.bin/babel-node ./static.method.js
  • Windows: .\node_modules\.bin\babel-node .\static.method.js

Output

findByName
[ { _id: 5dd127418afb34090e84cc63,
email: ’email1′,
password: ‘123’,
fullname: ‘name 1’,
gender: ‘male’,
createdAt: 2019-11-17T10:56:01.664Z,
__v: 0 },
{ _id: 5dd127418afb34090e84cc64,
email: ’email2′,
password: ‘123’,
fullname: ‘name 2’,
gender: ‘male’,
createdAt: 2019-11-17T10:56:01.791Z,
__v: 0 },
{ _id: 5dd127418afb34090e84cc65,
email: ’email3′,
password: ‘123’,
fullname: ‘name 3’,
gender: ‘female’,
createdAt: 2019-11-17T10:56:01.793Z,
__v: 0 } ]
————————————
findByEmail
{ _id: 5dd127418afb34090e84cc64,
email: ’email2′,
password: ‘123’,
fullname: ‘name 2’,
gender: ‘male’,
createdAt: 2019-11-17T10:56:01.791Z,
__v: 0 }

Kết

Static method được dùng khá nhiều trong mongoose, với việc khởi tạo các static method làm cho code rõ nghĩa hơn, giảm thiểu code etc.

Ví dụ nếu bạn không có findByName(), thì khi bạn cần tìm kiếm theo name bạn đều phải viết.

UserModel.find({name: new RegExp(name, 'i')});

Nếu có nhiều thông số hơn như tìm theo name, email age etc thì hàm find của bạn trông rất xấu. Khi bạn đã định nghĩa static method rồi bạn chỉ đơn giản gọi

UserModel.findByName(name);

Các bạn có download source static method để chạy và kiểm tra lại.

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x