扩展Mongoose Model的静态方法和实例方法

 

./model/db.js

// 引入mongoose
const mongoose = require("mongoose");

//解决index索引引起的弃用提醒:(node:13616) DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead.
mongoose.set("useCreateIndex", true); 

// 连接数据库
mongoose.connect("mongodb://127.0.0.1:27017/jtdb", { useNewUrlParser: true, useUnifiedTopology: true }, function (err, connection) {
  if (err) {
    console.log(err);
    return;
  }
  console.log("连接数据库成功");
});
module.exports = mongoose;

 

 

./model/users.js

/*
  mongoose 的自定义修饰符: Getters 与 setters
    除了mongoose内置修饰符以外,还可以通过 set (建议使用) 修饰符,对增加数据的时,对数据进行格式化;
    也可以通过 get(不建议使用)在 实例获取数据 的时候 对 实例数据 进行格式化。
*/

var mongoose = require("./db.js");
var userSchema = mongoose.Schema({
  sn: {
    type: Number,
    // unique: true, //唯一索引
    index: true, //普通索引,设定了索引的字段,是必须传入的
  },
  name: {
    type: String,
    upperCase: true, //全部大写
    // lowerCase: true,//全部小写
    get(params) {
      return "get加在前面的:" + params;
    },
  },
  title: {
    type: String,
    maxlength: 200, //最大长度
    minlength: 1, //最小长度
    required: true, //必填字段
    trim: true, //去除左右空格
  },
  age: {
    type: Number,
    max: 150, //最大值
    min: 0, //最小值
  },
  redirect: {
    type: String,
    // 自定义修饰符: set方法是在增加数据的时候对redirect字段进行处理
    set(parmas) {
      //parmas参数可以获取redirect的值 、   返回的数据就是redirect在数据库实际保存的值
      //   if (!parmas) return parmas;
      if (!parmas) {
        return "";
      } else {
        if (parmas.indexOf("http://") != 0 && parmas.indexOf("https://") != 0) {
          return "http://" + parmas;
        }
        return parmas;
      }
    },
  },
  status: {
    try: Number,
    default: 0, //默认填充
  },
});

//静态方法 使用 statics   通过静态方法来扩展 mongoose Model ----------------------
userSchema.statics.findBySn = function (sn, cb) {
  // 通过 find 方法获取 sn 的数据 , this 关键字获取当前的 model
  this.find({ sn: sn }, function (err, data) {
    cb(err, data);
  });
};
userSchema.statics.findByage = function (age, cb) {
  // 通过 find 方法获取 sn 的数据 , this 关键字获取当前的 model
  this.find({ age: age }, function (err, data) {
    cb(err, data);
  });
};

// ------------------------------------------------------------------

// 实例方法  使用 methods , (没多大用,基本不用) --------------------------------------
userSchema.methods.print = function () {
  var a1 = "这是a1";
  console.log("我是实例方法"); //直接输出
  console.log(this.a1); //undefind
  console.log(this); //this指向 user.js 中声明的 user ;
  console.log(this.age);
};

// ------------------------------------------------------------------

module.exports = mongoose.model("User", userSchema, "users");

 

user.js

var UserModel = require("./model/user.js");

// ./model/user.js 中 userSchema 的 name 里的 get 对实例进行操作
// var user = new UserModel({ sn: 1, name: "孙悟空", age: 40, title: "齐天大圣" });
var user = new UserModel({ sn: 6, age: 40, title: "猪八戒" });
// console.log(user.age); //20
// console.log(user.name); // get加在前面的:赵六

// 在./model/user.js 中 自定义的实例方法
user.print()

// UserModel.find({}, function (err, data) {
//   if (err) return console.log(err);
//   console.log(data);
// });

// 在./model/user.js 中自定义扩展的方法 findBySn
// UserModel.findBySn("3",function (err, data) {
//   if (err) return console.log(err)
//   console.log(data)
// })

// 在./model/user.js 中自定义扩展的方法 findByage
// UserModel.findByage("40", function (err, data) {
//   if (err) return console.log(err);
//   console.log(data);
// });

// user.save(function (err, data) {
//   if (err) return console.log(err);
//   console.log(data);
// });

/*
    PS D:\nodeDemo\mongoose02> node .\user.js
    20 
    get加在前面的:赵六--【按顺序执行完了实例的代码才执行数据库的连接】
    连接数据库成功
    [
    { _id: 5ffc15140e5352204c72840e, name: '张三', age: 20, __v: 0 },
    { _id: 5ffc1adc0c7993265064ef22, name: '李四', age: 20, __v: 0 }
    ]

*/

 

上一篇:mongoose 的使用【06】:mongoose 中使用 aggregate 聚合管道【02、order_item查询】


下一篇:MongoDB-mongoose 默认参数