zoukankan      html  css  js  c++  java
  • mongoose整理笔记

    一:参考学习网址

    npm: https://www.npmjs.com/package/mongoose

    官网API:http://mongoosejs.com/docs/guide.html

    二:在node中的连接

    1.先要安装mongoose: npm i mongoose --save

    2.如何连接:

    
    

    var mongoose = require('mongoose');

    //连接

    mongoose.connect( ' 地址 ' )  //自己需要连接的数据库地址,如本机的test数据库,就是 mongoose.connect('mongodb://localhost/test')

    var db = mongoose.connection;

    //连接成功
    db.on('connected', function () { console.log('Mongoose connection open to ' + DB_URL); }); 
    //连接异常 
    db.on('error',function (err) { console.log('Mongoose connection error: ' + err); }); 

    //连接断开

    db.on('disconnected', function () { console.log('Mongoose connection disconnected'); });

    module.exports
    = mongoose;

    三:关于Schema

    mongoose基本由Schema , Model , query 组成;

    1.Schema的作用:

      来定义表数据中的字段;
      和字段的类型;
      和字段的一些限定,例如长度......;
      和数据库的一些静态方法;

    2.Schema的创建方式:

      var UserSche = new mongoose.Schema( option ) ;

      2.1. Schema的参数option:

        这些参数的作用主要是在创建数据表之前,对立面的字段的一些控制,和一些属性的配置,如下面是基本完整的所有的参数的配置:

    var schema3 = new Schema({
        test: {
        type: String, //类型
        lowercase: true, // 总是将test的值转化为小写
        uppercase: true, // 总是将test的值转化为大写
        required:true, //设定是否必填
        default:'star', //设定默认值
        index:true, //设定索引值
        unique:true, //索引值唯一
        sparse:true, //是否启用稀疏索引 //一般用在LBS地理位置应用中
        match:RegExp, //判断是否通过正则验证
        enum:Array, //判断test值是否包含于enmu对应的数组中
        min:Number, //判断对应值是否大于等于给定值
        max:Number, //判断对应值是否小于等于给定值
        trim:true //去除数据前后的空格
        capped:1024 //限定大小最大为1024字节
        validate:function,为此属性添加一个验证器函数,如demo1所示
        get:function//为这个属性定义一个定制的getter Object.defineProperty()。如demo2所示
        set:function//定义此属性的自定义设置Object.defineProperty()。如demo2所示
        }
        });  
              //var schema3 = new Schema({ haha:{ type : String } }) //这是最基本的
     
    
    
    
    
    
    

        demo2:

    //将传入的值四舍五入后存储
    var numberSchema = new Schema({
      integerOnly: {
        type: Number,
        get: v => Math.round(v),
        set: v => Math.round(v),
        require:true
      }
    });
    View Code

       2.2.Schema的option中的type可配置的参数:

    //如果在Schema中字段不给类型的话就会,自动默认为混合类型Mixed
    String //字符串类型
    Number  //数字类型
    Date   //日期类型
    Boolean  //布尔类型
    Buffer
    ObjectId
    Mixed  //混合类型
    Array  //数组类型

          2.2.1.几种特殊类型的声明:

    //1.ObjectId
    UserSche. add ( { //schema的add方法是在之前new的基础上再添加字段
            owner : mongoose.Schema.Types.ObjectId 
        });
    
    /*2.Mixed:
        这个是混合类型;
        里面可以放置任何类型
        的数据;*/
        
    UserSchema . add ( {//第一种创建方式:
            owner : { }
        });
    
    UserSchema . add ( {//第二种创建方式:
            owner : mongoose.Schema.Types.Mixed 
        });
    
    
    //3.Array:
    UserSchema . add ( {//第一种创建简单数组:
            owner : [ String ]
        });
    
    var moreSchema = new mongoose.Schema( {//第二种复杂类型数组创建:
        email : String ,
        Verified : Boolean
        });    //在这里创建这个Schema来保存一些类型
    
    UserSchema . add ( {
            owner :  [ moreSchema ]  //把上面的Schema类型用在数组里面
        });

        2.3.Schema 创建静态方法

          2.3.1.作用:这个静态方法可以用在Model中直接调用,需要先声明Schema实例

          2.3.2.用法例子:

    UserSchema.statics.findById = function( id , callback) {
        this.find ( { ID : id } 
    };

    四:关于Model

      4.1.作用:Model是由Schema生成的Model;可以对数据库进行直接操作;

      4.2.插入数据:

    var user = mongoose.model ('user' ,UseSch);  //UseSch是在前面声明的Schema
    
    var users = new user( { 
            username : "liu",
            password :  123123,
            phone : 1111111
            }) ;
    user.save( function ( err ,res) { 
            if(err) { 
                console.log(err);
            }else{
                    console.log(res);
                }
            });  //后面可以通过query的点式操作来操作数据库,看起来更简洁

      4.3更新数据:

        4.3.1.普通更新,根据条件更新所有的

    //Model.update( 条件 , 更新项 , 回调函数 )
    var str = {'username' : 'liu'};
    var upsrt = {'userpwd': '666'};
    User.update(str, upsrt, function(err, res){
            if (err) {
                console.log("Error:" + err);
            }
            else {
                console.log("Res:" + res);
            }
        })

        4.3.2.通过id更新一条

    Model.findByIdAndUpdate(id, [update], [options], [callback])

        4.3.3.找到一条并更新

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

      4.4.删除数据:

        4.4.1.普通删除所有符合条件的

    Model.remove(conditions, [callback])

        4.4.2.通过id查到并且删除

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

        4.4.3.只找到第一个符合条件的并且删除

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

      4.5.查询

        4.5.1.条件查询

    //条件查询:
    Model.find(conditions, [fields], [options], [callback])
    
    /*Model.find(  查询条件  , 需要展示的
    字段如果是null就表示返回所有的字段 ,
     对查询出来的数据进行再次筛选 ,  [callback])*/

          4.5.1.1.一般条件查询

       User.find({'name', 'liu'}, 'name email',function(err, result) {
               //查询到所有这个表里面的名字是‘liu’ 的数据
              //并且只展示字段name 和 email 别的不要
                  console.log(result)  //返回包含上面两个字段的符合条件的数据
            
     });               

          4.5.1.2.再筛选查询

    参数3:
        User.find({'name', 'liu'}, 'name email', {skip: 0, limit: 4, sort: {ID: 1}}, function(err, result) {
    
    //查询到name是‘liu’ 的前4条,用ID进行正序排序的包含name ,email的数据
         console.log(result);
     });

          4.5.1.3.某个范围查询

    User.find( { age : {$gte:21 ,$lte:26} } , function( err, result ) {
                       //查到user表的年龄在 21 - 26 之间的数据
                          console.log(result)
            })

          规定范围的方法还有:

    $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个元素)
    View Code

        4.5.2.数量查询 :Model.count(conditions, [callback]) ;

        4.5.3.根据id查询 : Model.findById(id, [fields], [options], [callback]) ; 

        4.5.4.模糊查询 : 主要是用的正则 $regex 来模糊匹配

    var whereStr = {'username':{$regex:/m/i}};
        User.find(whereStr, function(err, res){
            if (err) {
                console.log("Error:" + err);
            }
            else {
                console.log("Res:" + res);
            }
        })   //找到所有名字中带有m的数据

        4.5.4.分页查询

    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);
            }
        })
    }

        4.5.6.去重查找 : Model.distinct(field, [conditions], [callback]) ;

        4.5.7.只查一条数据 : Model.findOne(conditions, [fields], [options], [callback]) ;

    五:query

    点式操作:
    Person.
      find({
        occupation: /host/,
        'name.last': 'Ghost',
        age: { $gt: 17, $lt: 66 },
        likes: { $in: ['vaporizing', 'talking'] }
      }).
      limit(10).
      sort({ occupation: -1 }).
      select({ name: 1, occupation: 1 }).
      exec(callback);
  • 相关阅读:
    题解 POJ1149 Pigs
    题解 【网络流24题】运输问题
    题解 【网络流24题】太空飞行计划
    题解 【网络流24题】方格取数问题
    题解 密码锁
    题解 【重庆八中模拟赛】寻找代表元
    题解 [SHOI2010]最小生成树
    题解 【ZJOI2009】 假期的宿舍
    题解 [ZJOI2008]树的统计Count
    JSP页面中的pageEncoding和contentType两种属性(转)
  • 原文地址:https://www.cnblogs.com/chun321/p/9035951.html
Copyright © 2011-2022 走看看