美文网首页
MongoDB&mongoose

MongoDB&mongoose

作者: Kiki_Q | 来源:发表于2020-10-02 23:07 被阅读0次

一.Nosql:什么时候选择nosql

1.对数据库高并发读写的需求
2.对海量数据的高效率存储和访问的需求
3.对数据库的高可扩展性和高可用性的需求

二.对比

非结构型数据库。没有行、列的概念。用JSON来存储数据。集合就相当于“表”,文档就相当于“行”。

三.安装教程

1.https://www.runoob.com/mongodb/mongodb-window-install.html
win7建议下载4.0.1
2.配置环境变量
安装完成配置环境变量C:\Program Files\MongoDB\Server\3.0\bin 加入到系统的path环境变量中
3.测试

image.png
4.开启服务(不关闭窗口)
mongod --dbpath D:\Program Files\mongoData//新建专门存储数据的文件夹

四、常用语句

1.show dbs
1.use student
2.db.student.insert({“name”:”xiaom ing”});
3.show collections
4.db.dropDatabase();
5.db.user.drop ()
6.db.表名.insert({"name":"zhangsan"});
7.db.userInfo.find();相当于:select* from userInfo;
8.db.userInfo.distinct("name");
会过滤掉name中的相同数据相当于:select distict name from userInfo;
9.db.userInfo.find({"age": 22});相当于:select * from userInfo w here age = 22;

4、查询age > 22的记录
db.userInfo.find({age: {$gt: 22}});
相当于:select * from userInfo w here age >22;
5、查询age < 22的记录
db.userInfo.find({age: {$lt: 22}});
相当于:select * from userInfo w here age <22;
6、查询age >= 25的记录
db.userInfo.find({age: {$gte: 25}});
相当于:select * from userInfo w here age >= 25;
7、查询age <= 25的记录
db.userInfo.find({age: {$lte: 25}});
8、查询age >= 23 并且age <= 26注意书写格式
db.userInfo.find({age: {$gte: 23, $lte: 26}});
9、查询name中包含mongo的数据模糊查询用于搜索
db.userInfo.find({name: /mongo/});
//相当于%%select * from userInfo w here name like ‘%mongo%’;
10、查询name中以mongo开头的
db.userInfo.find({name: /^mongo/});
select * from userInfo where name like ‘mongo%’;
11、查询指定列name、age数据
db.userInfo.find({}, {name: 1, age: 1});
相当于:select name, age from userInfo;当然name也可以用true或false,当用ture的情况下河name:1效果一样,如果用false就是排除name,显示name以外的列信息。
12、查询指定列name、age数据, age > 25
db.userInfo.find({age: {$gt: 25}}, {name: 1, age: 1});
相当于:select name, age from userInfo w here age >25;
13、按照年龄排序1升序-1降序
升序:db.userInfo.find().sort({age: 1});
降序:db.userInfo.find().sort({age: -1});
14、查询name = zhangsan, age = 22的数据db.userInfo.find({name: 'zhangsan', age: 22});
相当于:select * from userInfo w here name = ‘zhangsan’and age = ‘22’;
15、查询前5条数据db.userInfo.find().limit(5);
相当于:selecttop 5 *from userInfo;
16、查询10条以后的数据db.userInfo.find().skip(10);
相当于:select * from userInfo w here id not in (selecttop 10 * from userInfo);
17、查询在5-10之间的数据
db.userInfo.find().limit(10).skip(5);
可用于分页,limit是pageSize,skip是第几页*pageSize
18、or与查询
db.userInfo.find({$or: [{age: 22}, {age: 25}]});
相当于:select * from userInfo w here age = 22 or age = 25;
19、findOne查询第一条数据
db.userInfo.findOne();
相当于:selecttop 1 * from userInfo;db.userInfo.find().limit(1);
20、查询某个结果集的记录条数统计数量
db.userInfo.find({age: {$gte: 25}}).count();
相当于:select count(*) from userInfo w here age >= 20;
如果要返回限制之后的记录数量,要使用count(true)或者count(非0) db.users.find().skip(10).limit(5).count(true);
21.修改
1.db.student.update({"name":"小明"},{$set:{"age":16}});
2.db.student.update({"score.shuxue":70},{$set:{"age":33}})
3.db.student.update({"sex":"男"},{$set:{"age":33}},{multi: true})
4.完整替换,不出现$set关键字了:注意1db.student.update({"name":"小明"},{"name":"大明", "age":16});
db.users.update({name: 'Lisi'}, {$inc: {age: 50}}, false, true);
相当于:update users set age = age + 50 where name = ‘Lisi’;
db.users.update({name: 'Lisi'}, {$inc: {age: 50}, $set: {name: 'hoho'}}, false, true);
相当于:update users set age = age + 50, name = ‘hoho’w here name = ‘Lisi’;
22.删除
1.db.users.remove({age: 132})
2.db.users.remove({age: 132},{justone:true})
####五、索引、explain
1.创建索引:db.user.ensureIndex({"username":1})
2.获取当前集合的索引:db.user.getIndexes()
3.删除索引:db.user.dropIndex({"username":1})
4.复合索引(数字1表示username键的索引按升序存储,-1表示age键的索引按照降序方式存储):db.user.ensureIndex({"username":1, "age":-1})
5.唯一索引:db.user.ensureIndex({"userid":1},{"unique":true})
6. image.png

7.查看查询的时间:db.tablename.find().explain( "executionStats")

六、nodejs中引用MongoDB

1.引入包:npm install mongodb --save-dev

var express = require("express");//数据库引用
var MongoClient = require('mongodb').MongoClient;
var app = express();
//数据库连接的地址,最后的斜杠表示数据库名字
var shujukuURL = 'mongodb://localhost:27017/news';
app.get("/",function(req,res){
//连接数据库,这是一个异步的操作
  MongoClient.connect(shujukuURL, function(err, client) {
     res.writeHead(200,{"Content-Type":"text/html;charset=UTF8"});
     if(err){
       res.send("数据库连接失败");
       return;
     }
    res.write("恭喜,数据库已经成功连接\n");
    //新的mongo不直接用db,返回的是client对象
    let db = client.db('student');
    db.collection("user").insertOne({"name":"哈哈"},function(err,result){
        if(err){
           res.send("数据库写入失败");
          return;
        }
        res.write("恭喜,数据已经成功插入");
        res.end();
       //关闭数据库
       db.close();
   });
 });
});
app.listen(8020);

七、MongoDB权限配置管理

1.
image.png
image.png
2.常用的命令

1、show users; 查看当前库下的用户
2、db.dropUser("eggadmin") 删除用户
3、db.updateUser("admin",{pwd:"password"}); 修改用户密码
4、db.auth("admin","password"); 密码认证

3.Mongodb数据库角色

1.数据库用户角色:read、readWrite;
2.数据库管理角色:dbAdmin、dbOwner、userAdmin;
3.集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
4.备份恢复角色:backup、restore;
5.所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
6.超级用户角色:root

4.连接数据库的时候需要配置账户密码

consturl='mongodb://admin:123456@localhost:27017/';

八、数据库表之间的几种关系

1.一对一
2.一对多
3.多对多

九、聚合管道(表的关联、数据统计)

db.order.aggregate([
{
    $project:{ trade_no:1, all_price:1 }
},
{
    $match:{"all_price":{$gte:90}}
},
{
    $group: {_id: "$order_id", total: {$sum: "$num"}}
},
{
    $sort:{"all_price":-1}
},
{
    $limit:1
},{
    $skip:1
},{
  $lookup:{
      from: "order_item",
      localField: "order_id", 
      foreignField: "order_id", 
      as:       "items"
   }
}
])

十、mongoose

一、特点

1、通过关系型数据库的思想来设计非关系型数据库
2、基于mongodb驱动,简化操作

二、安装和使用

1.安装

npm i   mongoose --save

2.引入 mongoose 并连接数据库

const mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/test',{useNewUrlParser:true},function(){}); 
如果有账户密码需要采用下面的连接方式:
mongoose.connect('mongodb://eggadmin:123456@localhost:27017/eggcms');

3.定义 Schema

var UserSchema=mongoose.Schema({ 
  name: String,
  age:Number, 
  status:'number'
})

4.创建数据模型

var User=mongoose.model('User', UserSchema); //users
or
var User=mongoose.model('User', UserSchema,'user'); //user

5.查找数据

User.find({},function(err,docs){ if(err){
console.log(err); return;
}
console.log(docs);
})

6.增加数据

var u=new User({    //实例化模型 传入增加的数据
name:'lisi2222333', age:20,
status:true
})
u.save();

7.修改数据

User.updateOne({ name: 'lisi2222' }, { name: '哈哈哈' }, function(err, res) { if(err){
console.log(err); return;
}
console.log('成功')
});

8、删除数据

User.deleteOne({ _id: '5b72ada84e284f0acc8d318a' }, function (err) { if (err) {
console.log(err); return;
}
// deleted at most one tank document

console.log('成功');
});

三、默认参数&模块化

1.默认参数

var UserSchema=mongoose.Schema({ 
  name: String,
  age:Number, 
  status:{
        type:number,
        default:1
  }
})

2.模块化


image.png image.png

3.性能


image.png

四、Mongoose预定义模式修饰符Getters与Setters自定义修饰符

1.预定义模式修饰符
lowercase、uppercase、trim

varUserSchema=mongoose.Schema({name:{type:String,trim:true}})

2.set&get

var NewsSchema = mongoose.Schema({
  title:"string",
  author:String,
  pic:String,
  redirect:{
    type:String,
   set(url){
     if(!url) return url;
     if(url.indexOf('http://')!=0&&url.indexOf('https://')!=0){
        url='http://'+url;
     }
    return url;
   },
 get:function(url){
    if(!url) returnurl;
    if(url.indexOf('http://')!=0&&url.indexOf('https://')!=0){
      url='http://'+url;
     }
    return url;
  }
}

五、Mongoose索引、Mongoose内置CURD方法、扩展MongooseModel的静态方法和实例方法

1.索引

var DeviceSchema = new mongoose.Schema({
  sn:{
    type:Number,
    //唯一索引
    unique:true
   },
   name:{
      type:String,
      //普通索引
      index:true
    }
});

2.Mongoose内置CURD


image.png

3.方法

//静态方法
UserSchema.statics.findByUid = function(uid,cb){
    this.find({"_id":uid},function(err,docs){
        cb(err,docs)
    })
}
//实例方法
UserSchema.methods.print = function(){
    console.log('这是一个实例方法');
    console.log(this);
};
module.exports=mongoose.model('User',UserSchema,'user')

扩展

//es5

 function Person(){
        this.run1=function(){  

        }
    }
    Person.name='哈哈哈';

    Person.run2=function(){  静态方法


    }
    var p=new Person();

    Person.run2(); 静态方法的调用


    p.run1(); 实例方法



//ts中


class Per{
        public name:string;
        public age:number=20;
        //静态属性

        static sex="男";
        constructor(name:string) {
                this.name=name;
        }
        run(){  /*实例方法*/

            alert(`${this.name}在运动`)
        }
        work(){

            alert(`${this.name}在工作`)
        }
        static print(){  /*静态方法  里面没法直接调用类里面的属性*/

            alert('print方法'+Per.sex);
        }
    }

    // var p=new Per('张三');

    // p.run();

    Per.print();

    alert(Per.sex);

六、数据校验

1.校验参数


image.png
var UserSchema=newmongoose.Schema({
    age:{
        type:Number,
        //是否必须的校验器
        required:true,
        //数字类型的最大值校验器
        max:120,
        //数字类型的最小值校验器
        min:0
      },
      status:{
          type:String,
          //设置字符串的可选值
          enum:['0','1','2']
      },
      phone:{
          type:Number,
          match:/^\d{11}$/
      },
      desc:{
        type:String,
        maxlength:20,
        minlength:10,
       //自定义的验证器,如果通过验证返回true,没有通过则返回false
        validate:function(desc){
          return  desc.length>=10;
       }
      }
})

七、Mongoose中使用aggregate聚合管道

1.aggregate聚合管道

var mongoose = require('./db.js');
var OrderSchema = mongoose.Schema({
      order_id:String,
      uid:Number,
      trade_no:String,
      all_price:Number,
      all_num:Number
})
var OrderModel = mongoose.model('Order',OrderSchema,'order');
OrderModel.aggregate([{
    $lookup:{
      from:'order_item',
      localField:"order_id",
      foreignField:"order_id",
      as:"item"
    }
}],function(err,docs){
      console.log(docs)
});
image.png

2.多表关联查询


image.png

八、Mongoose中使用populate实现关联查询

1.versions>=3.2


image.png

2.实现
//model定义


image.png
//
image.png
image.png

九、数据库备份、还原&导入、导出

image.png image.png

相关文章

  • MongoDB&mongoose

    一.Nosql:什么时候选择nosql 1.对数据库高并发读写的需求2.对海量数据的高效率存储和访问的需求3.对数...

网友评论

      本文标题:MongoDB&mongoose

      本文链接:https://www.haomeiwen.com/subject/szblyktx.html