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

猜你喜欢

转载自www.cnblogs.com/chun321/p/9035951.html