Tìm hiểu thêm về Schema trong Mongoose

Phùng Hùng

Phùng Hùng

Teacher and Programmer

Tạo model từ Schema

const Blog = mongoose.model('Blog', blogSchema);

Tạo phương thức cho document

Từ Schema ta có thể tạo ra một phương thức mới cho mọi document qua đôi tượng schema.methods.

Ví dụ sau tạo ra phương thức findSimilarTypes cho các document của animalSchema:

// define a schema
const animalSchema = new Schema({ name: String, type: String });
// assign a function to the "methods" object of our animalSchema
animalSchema.methods.findSimilarTypes = function (cb) {
return mongoose.model('Animal').find({ type: this.type }, cb);
};
const Animal = mongoose.model('Animal', animalSchema);
const dog = new Animal({ type: 'dog' });
dog.findSimilarTypes((err, dogs) => {
console.log(dogs); // woof
});
  • Chú ý là không nên dùng hàm mũi tên để tạo phương thức.
  • this trỏ đến document.

Tạo phương thức tĩnh cho Model

// Assign a function to the "statics" object of our animalSchema
animalSchema.statics.findByName = function (name) {
return this.find({ name: new RegExp(name, 'i') });
};
// Or, equivalently, you can call `animalSchema.static()`.
animalSchema.static('findByBreed', function (breed) {
return this.find({ breed });
});
const Animal = mongoose.model('Animal', animalSchema);
let animals = await Animal.findByName('fido');
animals = animals.concat(await Animal.findByBreed('Poodle'));
  • Chú ý là không nên dùng hàm mũi tên để tạo phương thức tĩnh.
  • this trỏ đến model.

Tạo chỉ mục

Có thể tạo trong SchemaType hoặc sử dụng phương thức index của schema.

const animalSchema = new Schema({
name: String,
type: String,
tags: { type: [String], index: true }, // field level
});
animalSchema.index({ name: 1, type: -1 }); // schema level

Khi ứng dụng khởi động, Mongoose tự động gọi createIndex để tạo các chỉ mục được khai báo trong Schema. Sự kiện index được bắn ra khi createIndex thực hiện xong cho mọi chỉ mục.

// Will cause an error because mongodb has an _id index by default that
// is not sparse
animalSchema.index({ _id: 1 }, { sparse: true });
const Animal = mongoose.model('Animal', animalSchema);
Animal.on('index', error => {
// "_id index cannot be sparse"
console.log(error.message);
});

Hành vi này giúp thuận tiện cho bạn trong quá trình phát triển ứng dụng, nhưng khi triển khai sản phẩm bạn nên tắt nó đi vì nó làm giảm hiệu năng:

mongoose.connect('mongodb://localhost', { autoIndex: false });
// hoặc
animalSchema.set('autoIndex', false);
// hoặc
new Schema({..}, { autoIndex: false });

Thuộc tính ảo

// define a schema
const personSchema = new Schema({
name: {
first: String,
last: String,
},
});
// Định nghĩa thuộc tính ảo
personSchema.virtual('fullName').get(function () {
return this.name.first + ' ' + this.name.last;
});

Có thể định nghĩa cả getter và setter cho thuộc tính ảo:

personSchema
.virtual('fullName')
.get(function () {
return this.name.first + ' ' + this.name.last;
})
.set(function (v) {
this.name.first = v.substr(0, v.indexOf(' '));
this.name.last = v.substr(v.indexOf(' ') + 1);
});