一、Schema

关于 mongoose 基本概念和基本增删改查操作,参照:

Schema 除了定义 Model 的基本骨架外,还能够为 Model 创建多种方法。

在使用过程中,没有发现 实例方法 - Instance Method 有什么具体的作用,因此不阐述实例方法,关于实例方法的文档地址:

在赋值 Schema 的方法时,不能使用 ES6 的箭头函数,否则会造成上下文绑定的问题!

二、静态方法 Static Methods

mongoose 的静态方法是挂载到 mongoose.statics 属性上面的。

1、基本使用

使用 静态方法 实现根据姓名查找的功能

// 静态方法 根据 name 查找
userSchema.statics.findByName = function(name,cb){
  return this.find({name},cb);
}

调用挂载的静态方法

User.findByName('name').then((docs)=>{
    console.log(docs);
});

2、简易分页

通过一个静态方法实现分页

userSchema.statics.paginate = function (conditons={},skip = 0,limit = 1){
  return this.find(conditons).skip(skip).limit(limit);
}

分页调用方法示例:

User.paginate({},getSkip(1),limit).then((docs)=>{
    console.log("第1页",docs);
});

User.paginate({},getSkip(2),limit).then((docs)=>{
    console.log("第2页",docs);
});

User.paginate({},getSkip(3),limit).then((docs)=>{
    console.log("第3页",docs);
});

查询结果(数据库中只有四条数据):

第1页 [ { age: 15, _id: 5afeacd59d7fcd7f8d897643, name: 'ptbird-model', __v: 0 },
{ age: 16, _id: 5afeacd59d7fcd7f8d897644, name: 'ptbird-model-1', __v: 0 } ]
第3页 []
第2页 [ { age: 17, _id: 5afeacd59d7fcd7f8d897646, name: 'ptbird-entity', __v: 0 },
{ age: 18, _id: 5afeacd59d7fcd7f8d897645, name: 'ptbird-model-2', __v: 0 } ]

三、查询助手方法

查询助手方法是挂载到 query 上面的

通过查询助手方法实现 根据姓名查找 的功能:

userSchema.query.byName = function (name){
  return this.find({name});
}

查询助手方法和静态方法的使用方式不一样,需要有 .find() 作为前提,链式调用,同时结尾必须进行 .exec()

User.find().byName('ptbird-model').exec().then((docs)=>{
    console.log(docs);
});