schema

实例方法

所有在schema上定义的方法都会被实例化的模型继承

1
2
3
4
5
6
7
// define a schema
var animalSchema = new Schema({ name: String, type: String });
// assign a function to the "methods" object of our animalSchema
animalSchema.methods.findSimilarTypes = function(cb) {
return this.model('Animal').find({ type: this.type }, cb);
};

静态方法

1
2
3
4
5
6
7
8
9
// assign a function to the "statics" object of our animalSchema
animalSchema.statics.findByName = function(name, cb) {
return this.find({ name: new RegExp(name, 'i') }, cb);
};
var Animal = mongoose.model('Animal', animalSchema);
Animal.findByName('fido', function(err, animals) {
console.log(animals);
});

同实例方法类似

查询助手

您还可以像实例方法那样添加查询辅助功能,这是,但对于mongoose的查询。查询辅助方法可以让你扩展mongoose链式查询生成器API。

1
2
3
4
5
6
7
8
animalSchema.query.byName = function(name) {
return this.find({ name: new RegExp(name, 'i') });
};
var Animal = mongoose.model('Animal', animalSchema);
Animal.find().byName('fido').exec(function(err, animals) {
console.log(animals);
});

虚拟属性

虚拟属性 是文档属性,您可以获取和设置但不保存到MongoDB。用于格式化或组合字段,从而制定者去组成一个单一的值为存储多个值是有用的。
// define a schema
var personSchema = new Schema({
name: {
first: String,
last: String
}
});

// compile our model
var Person = mongoose.model(‘Person’, personSchema);

// create a document
var bad = new Person({
name: { first: ‘Walter’, last: ‘White’ }
});
假设我们想打印bad的全名。我们可以这样做:
console.log(bad.name.first + ‘ ‘ + bad.name.last); // Walter White
或者我们可以在personschema定义 虚拟属性的getter ,这样我们不需要每次写出这个字符串的拼接:
personSchema.virtual(‘name.full’).get(function () {
return this.name.first + ‘ ‘ + this.name.last;
});
现在,我们进入我们的虚拟”的”name.full”资源的时候,我们将调用getter函数的返回值:
console.log(‘%s is insane’, bad.name.full); // Walter White is insane
注意,如果产生的记录转换为一个对象或JSON,virtuals不包括默认。通过virtuals:true是toobject()或tojson()他们返回值。
这也是不错的,能够通过this.name.full设置this.name.first和this.name.last。例如,如果我们想respectively改变bad的name.first和name.last为’Breaking’和’Bad’,只需要:
bad.name.full = ‘Breaking Bad’;
Mongoose让你这样做也是通过虚拟属性的setter:
personSchema.virtual(‘name.full’).set(function (name) {
var split = name.split(‘ ‘);
this.name.first = split[0];
this.name.last = split[1];
});

mad.name.full = ‘Breaking Bad’;
console.log(mad.name.first); // Breaking
console.log(mad.name.last); // Bad
[虚拟属性的setter 在其他验证之前使用。因此,上面的例子仍然可以工作,即使第一个和最后一个name字段是必需的。
只有非虚拟属性工作作为查询的一部分和字段选择。