Để 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.