nodeJs —— mongoose学习及案例

文档地址:http://www.mongoosejs.net/docs/guide.html

介绍:Mongoose是在node.js异步环境下对mongodb进行便捷操作的对象模型工具

安装mongoose:

$ npm install mongoose

连接数据库

  connect() 返回一个状态待定(pending)的连接, 接着我们加上成功提醒和失败警告

例:

let mongoose = require('mongoose');
const db = 'mongodb://127.0.0.1/vue_mall_mobile';
// const db = 'mongodb://127.0.0.1/vue_mall_mobile_v2'; // 服务器临时部署数据库

// 导出一个方法
exports.connect = () => {
  // 连接数据库
  mongoose.connect(db);
  // 记录数据库连接的次数
  let maxConnectTimes = 0;
  
  return new Promise((resolve, reject) => {
    // 连接成功操作
    mongoose.connection.once('open', () => {
      console.log('Mongodb 数据库连接成功.');
      resolve();
    });
    // 连接断开操作
    mongoose.connection.on('disconnected', () => {
      console.log('*********** 数据库断开 ***********');
      if (maxConnectTimes < 3) {
        maxConnectTimes++;
        mongoose.connect(db);
      } else {
        reject(new Error('数据库连接失败'));
        throw new Error('数据库连接失败');
      }
    });
    // 连接失败操作
    mongoose.connection.on('error', error => {
      console.log('*********** 数据库错误 ***********');
      if (maxConnectTimes < 3) {
        maxConnectTimes++;
        mongoose.connect(db);
      } else {
        reject(error);
        throw new Error('数据库连接失败');
      }
    });
  });
}

定义一个user的Schema

/** * 用户信息 */ 
var mongoose = require('./db.js'), 
Schema = mongoose.Schema; 
var UserSchema = new Schema({ 
username : { type: String }, //用户账号   userpwd: {type: String}, //密码   userage: {type: Number}, //年龄   logindate : { type: Date} //最近登录时间 }); module.exports = mongoose.model('User',UserSchema);

  Schema Types内置类型如下:

    String  Number  Boolean|Bool  Array  Buffer  Date  ObjectId|Oid  Mixed    

常用数据库操作:

  插入:Model#save([fn])

var User = require("./user.js");
 /** * 插入 */ 
function insert() { 
  var user = new User({ 
username : 'Tracy McGrady', //用户账号     userpwd: 'abcd', //密码     userage: 37, //年龄     logindate : new Date() //最近登录时间
});   user.save(function (err, res) {     if (err) {       console.log("Error:" + err);     } else {       console.log("Res:" + res);      }   }); } insert();

  

  更新:

    Model.update(conditions, update, [options], [callback])

    Model.findByIdAndUpdate(id, [update], [options], [callback])    这种比较有指定性,就是根据_id

    Model.findOneAndUpdate([conditions], [update], [options][callback])      //找到一条记录并更新

// Model.update(conditions, update, [options], [callback])

var User = require("./user.js");

function update() {
  var wherestr = {
    'username': 'Tracy McGrady'
  };
  var updatestr = {
    'userpwd': 'zzzz'
  };
  User.update(wherestr, updatestr, function (err, res) {
    if (err) {
      console.log("Error:" + err);
    } else {
      console.log("Res:" + res);
    }
  })
}
update();
//  Model.findByIdAndUpdate(id, [update], [options], [callback])

var User = require("./user.js");

function findByIdAndUpdate() {
  var id = '56f2558b2dd74855a345edb2';
  var updatestr = {
    'userpwd': 'abcd'
  };
  User.findByIdAndUpdate(id, updatestr, function (err, res) {
    if (err) {
      console.log("Error:" + err);
    } else {
      console.log("Res:" + res);
    }
  })
}
findByIdAndUpdate();

  删除    

    Model.remove(conditions, [callback])

    Model.findByIdAndRemove(id, [options], [callback])      

    Model.findOneAndRemove(conditions, [options], [callback])

// Model.remove(conditions, [callback])
var User = require("./user.js");

function del() {
  var wherestr = {
    'username': 'Tracy McGrady'
  };
  User.remove(wherestr, function (err, res) {
    if (err) {
      console.log("Error:" + err);
    } else {
      console.log("Res:" + res);
    }
  })
}
del();

  条件查询:

    Model.find(conditions, [fields], [options], [callback])

// Model.find(conditions, [fields], [options], [callback])
var User = require("./user.js");

function getByConditions() {
  var wherestr = {
    'username': 'Tracy McGrady'
  };
  User.find(wherestr, function (err, res) {
    if (err) {
      console.log("Error:" + err);
    } else {
      console.log("Res:" + res);
    }
  })
}
getByConditions();
// Model.find(conditions, [fields], [options], [callback])

// 第2个参数可以设置要查询输出的字段,比如:
// 输出只会有username字段,设置方法如上,1表示查询输出该字段,0表示不输出
// 比如我要查询年龄范围条件应该怎么写呢?
// User.find({userage: {gte: 21,lte: 65}}, callback); //这表示查询年龄大于等21而且小于等于65岁

// 其实类似的还有:
// $or    或关系
// $nor    或关系取反
// $gt    大于
// $gte    大于等于
// $lt     小于
// $lte    小于等于
// $ne 不等于
// $in 在多个值范围内
// $nin 不在多个值范围内
// $all 匹配数组中多个值
// $regex  正则,用于模糊查询
// $size   匹配数组大小
// $maxDistance  范围查询,距离(基于LBS)
// $mod   取模运算
// $near   邻域查询,查询附近的位置(基于LBS)
// $exists   字段是否存在
// $elemMatch  匹配内数组内的元素
// $within  范围查询(基于LBS)
// $box    范围查询,矩形范围(基于LBS)
// $center 范围醒询,圆形范围(基于LBS)
// $centerSphere  范围查询,球形范围(基于LBS)
// $slice    查询字段集合中的元素(比如从第几个之后,第N到第M个元素)
// 可能还有一些,没什么印象,大家自行看看api _!

var User = require("./user.js");

function getByConditions() {
  var wherestr = {
    'username': 'Tracy McGrady'
  };
  var opt = {
    "username": 1,
    "_id": 0
  };
  User.find(wherestr, opt, function (err, res) {
    if (err) {
      console.log("Error:" + err);
    } else {
      console.log("Res:" + res);
    }
  })
}
getByConditions();

  数量查询  

    Model.count(conditions, [callback])

//  Model.count(conditions, [callback])

var User = require("./user.js");

function getCountByConditions() {
  var wherestr = {};

  User.count(wherestr, function (err, res) {
    if (err) {
      console.log("Error:" + err);
    } else {
      console.log("Res:" + res);
    }
  })
}

getCountByConditions();

  根据ID查询:

    Model.findById(id, [fields], [options], [callback])

//  Model.findById(id, [fields], [options], [callback])

var User = require("./user.js");

function getById() {
  var id = '56f261fb448779caa359cb73';
  User.findById(id, function (err, res) {
    if (err) {
      console.log("Error:" + err);
    } else {
      console.log("Res:" + res);
    }
  })
}
getById();

  模糊查询

//  模糊查询
//  示例中查询出所有用户名中有'm'的名字,且不区分大小写,模糊查询比较常用,正则形式匹配,正则方式就是javascript正则,用到的比较多!

var User = require("./user.js");

function getByRegex() {
  var whereStr = {
    'username': {
      $regex: /m/i
    }
  };
  User.find(whereStr, function (err, res) {
    if (err) {
      console.log("Error:" + err);
    } else {
      console.log("Res:" + res);
    }
  })
}
getByRegex();

  分页查询:

//  分页查询
//  分页是用得比较多的查询,分页原理用过其它数据库的都知道,分页用到的函数和mysql的比较类似,sort()是排序规则

var User = require("./user.js");

function getByPager() {
  var pageSize = 5; //一页多少条 
  var currentPage = 1; //当前第几页 
  var sort = {
    'logindate': -1
  }; //排序(按登录时间倒序) 
  var condition = {}; //条件 
  var skipnum = (currentPage - 1) * pageSize; //跳过数 
  User.find(condition).skip(skipnum).limit(pageSize).sort(sort).exec(function (err, res) {
    if (err) {
      console.log("Error:" + err);
    } else {
      console.log("Res:" + res);
    }
  })
}
getByPager();