zoukankan      html  css  js  c++  java
  • 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();
  • 相关阅读:
    面向对象的三大特性之继承和多态(20161025)
    面向对象基础和面向对象的三大特性之一:封装(20161024)
    正则表达式和数组(20161023)
    php基础语法(20161021)
    学生选课数据库SQL语句45道练习题整理及mysql常用函数(20161019)
    CRUD操作(20161017)
    TSQL语句和CRUD(20161016)
    Combine Two Tables
    Second Highest Salary
    Employees Earning More Than Their Managers
  • 原文地址:https://www.cnblogs.com/LChenglong/p/12107430.html
Copyright © 2011-2022 走看看