MongoDb (NoSql)

313 阅读4分钟

简介NoSQL

NoSQL(not only SQL)意不仅仅是SQL,它指的是非关系型的数据库,是以key-value形式存储,和传统的关系型数据库不一样,不一定遵循传统数据库的一些基本要求,比如遵循SQL标准,ACID属性、表结构等等,NOoSQL最早被提出是20世纪80年代,在当时更多强调的是与关系型数据库区别对待,最近这些年被提及的更多的是强调协助解决大数据等相关问题,NoSQL在大数据时代有自己的意义。

MongoDb

MongoDb是一个介于关系型数据库与非关系型数据库之间的产品,是非关系数据库当中功能最丰富的,最像关系型数据库的NoSQL数据库,它支持的数据结构非常松散,是类似JSON 的bson格式,因此可以储存比较复杂的数据类型,MongoDb最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语法,几乎可以实现类似关系型数据库绝大部分功能,它的特点是高性能,易部署、易使用、储存数据非常方便。

NoSQL和传统数据库简单对比

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

数据库对比

安装

下载安装包 配置path大家都懂的对吧,可视化选项可以先不勾选
cmd或者控制台输入mongo 开启服务和mongodb建立连接
cls 相当于clear(清屏)

查看当前所有的数据库

show dbs

查看数据库

创建数据库或者移动至该数据库

use dbName 如果数据库存在不做操作,如果不存在,移动至已存在的数据库,需要增加数据才能保存该目录

增加表(集合)操作

db.user.insert({"name":"小可爱","age":8}) 插入名为user的数据(表)

删除数据库,删除当前数据库

use dataName db.dropDatabase() 先选择要删除的数据库,再执行删除操作
db.collectionName.drop() 删除名为collectionName的表

查看数据

show collections 查看数据库内中所有的表
db.user.find() 查看表中所有的数据

根据条件查询数据

db.names.find({"time":20})//查找所有时长为20的数据

查看数据

大于

查找大于35的数据

条件查询

//大于等于
db.names.find({"time":{$gte:35}})
小于

查找小于35的数据

查看数据

//小于等于
db.names.find({"time":{$lte:35}})

多个查找条件

db.names.find({name:"切水果","time":20})//查找切水果所有时长为20的数据

多个条件查找
模糊查询用于搜索
模糊查询用于匹配关键字,但数据量过大不建议这种方式,可以去找找相关的第三方库
模糊查询
正则查询
正则查询
指定列查询,查询指定字段内容

db.names.find({},{time:{$gt:1}})//只显示所有关于time 的内容
db.names.find({time:{$gte:40,$lte:50}},{name:"随便什么名字"})//只显示所有大于等于40小于等于50的name字段数据
//升序
db.name.find().sort({time:1})
//降序
db.name.find().sort({time:-1})
//查询前五行数据
db.names.find().limit(5)
//查找第10条以后的数据
db.names.find().skip(10)//跳过前10行开始查询
//显示数据量
db.names.find().count()
//分页,每次只拿10条数据
db.names.find().skip(0).limit(10)
//or查询 多条件查询
db.names.find({$or:[{name:"切水果"},{name:"坦克大战"}]})
//findOne查找第一条数据
db.names.findOne()

修改数据

//更新数据
db.names.update({name:"旧名字"},{$set:{name:"新名字"}})
//没有$set会完整替换
db.names.update({name:"旧名字"},{name:"新名字",age:"新添加的年龄18"})
//批量修改
db.names.update({name:"旧名字"},{$set:{name:"新名字"}},{multi:true})

删除数据

db.collectionsName.remove({"borough":"Manhattan")

db.names.remove({name:"对应的name",age:"对应的年龄"})//删除符合条件的数据
//删除大于30岁的数据
db.names.remove({age:{$gt:30}})
//只删除一条
db.number.remove({age:{$gt:9}},{justOne:true})
//删除全部数据
db.names.remove({})//传入空对象,删除全部数据

索引基础

索引是对数据库表中一列或多列的值进行排序的一种结构,可以让我们查询数据库变得更快,mongoDb的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的查询优化技巧。

索引命令

//查询具体的执行时间
db.tablename.find().explain("executionStats")
//查看当前集合索引
db.names.getIndexes()
//创建索引方式
db.names.ensureIndex({name:1})
//删除索引
db.names.dropIndex({age:1})
//复合索引
db.names.ensureIndex({name:1,age:1})//创建复合索引
db.names.find({name:"张三99998"})//命中查询,耗时短
db.names.find({name:"张三99998",age:99998})//命中查询,耗时短
db.names.find({age:98999})//如果这写后一个参数,无法命中查询,耗时增加
唯一索引
db.names.ensureIndex({age:1},{unique:true})//创建唯一索引
db.names.insert({name:"新插入名字",age:16})//如果创建了唯一索引,而且names集合中有了age:16的数据会无法插入新的数据
db.number.find()

mongodb 账户权限设置

  1. 数据库用户角色:read/readWrite
  2. 数据库管理角色:adAdmin/dbOwner/userAdmin
  3. 集群管理角色:clusterAdmin/clusterManager/clusterMonitor/hostmanager
  4. 备份恢复角色:backup/restore
  5. 所有数据库角色:readAnyDatabase/readWriteAnyDatabase/userAdminAnyDatabase
  6. 超级用户角色:root
show users//查看当前用户权限列表
db.dropUser("admin")//删除已有的用户admin账号
//创建超级管理员
db.createUser({
    user:"admin",
    pwd:"123456",
    roles:[{role:"root",db:"admin"}]
})
//开启验证修改mongod.cfg配置,修改前记得备份哦
security:
    authorization:"enabled"//格式一定要对 要对齐 不然坑自己
//win + r打开 services.msc 找到MongoDB Server 重新启动mongdb服务
//登录
mongo admin -u admin -p 123456
//设置普通用户权限,指定访问某个数据库
use game 
//Owner表示对当前的数据库有所有的权限
db.createUser({
    user:"gameadmin",
    pwd:"123456",
    roles:[{role:"dbOwner",db:"game"}]//
})
//登录
mongo game -u gameadmin -p 123456//用新账号访问game数据库
//auth登录
mongo game //选择要进入的数据库
db.auth("gameadmin","123456")

关系型数据库表(集合)与表(集合)之间的关系

一对一关系

例如:一个人对应唯一的身份证号,即为一对一的关系。

一对一

一对多关系

一对多
例如:一个班级对应多名学生,即为一对多关系。

多对多关系

多对多
例如:一个学生可以选多门课程,而同一门课程可以被多个学生修选,彼此的对应关系

聚合管道aggregate pipeline

使用聚合管道对集合中的文档进行变换和组合。

聚合管道

$project:可以用来重命名/增加或删除文档中的字段

db.order.aggregate([{$project:{order_id:1,trade_no:1,all_price:1}}])
//$match用于过滤文档,用法类似于find()中的参数,用于查找满足条件的数据
db.order.aggregate(
    [
        {
            $project:{order_id:1,trade_no:1,all_price:1}//要拿到那些数据项
        },
        {
            $match:{"all_price":{$gt:50}}//数据满足的条件
        }
    ]
)

project and match

group 分组,将所有同id的数据汇总的小例子

//汇总同id的总价
db.order_item.aggregate(
    [
        {
            $group:{_id:"$order_id",total:{$sum:"$price"}}
        }
    ]
)

group

$sort 用来排序

db.order.aggregate(
    [
        {
            $project:{order_id:1,trade_no:1,all_price:1}//要拿到那些数据项
        },
        {
            $match:{"all_price":{$gt:50}}//数据满足的条件
        },
        {
            $sort:{"all_price":-1}//排序
        },
        {
            $skip:1//跳过一条数据
        }
    ]
)

lookup表关联

order

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

nodeJS中操作mongdb数据库官方文档

安装mongodb操作模块
npm install mongodb --save

//引入mongodb
const {MongoClient} = require('mongodb')

const assert = require('assert')

const url =  "mongodb://admin:123456@localhost:27017"

//定义要操作的数据库
const dbName = "web"

//实例化MongoClient 传入数据库连接地址
const client = new MongoClient(url,{'useUnifiedTopology': true} );

//连接数据库
client.connect((err)=>{
    if(err){
        console.log(err)
        return
    }
    console.log('数据库连接成功')
    let db = client.db(dbName)
    db.collection("game").find({'age':13}).toArray((err,data)=>{
        console.log(data)
        //操作数据库完毕后一定要关闭数据库
        client.close()
    })
    
    //增加数据
    db.collection("user").insertOne({"user":"nodejs操作mongodb","age":10},(err,result)=>{
        if(err){
            console.log(err)
            return
        }
        console.log("增加成功")
        console.log(result)
        client.close()
    })
    //修改数据
    db.collection("user").updateOne({"username":"张三"},{$set:{"age":10}},(err,result)=>{
        if(err){//修改失败
            console.log(err)
            return
        }
        console.log("修改成功")
        console.log(result)
        client.close()

    })
    //删除数据
    db.collection("user").deleteOne({"username":"nodejs"},(err)=>{
        if(err){
            console.log(err)
            return
        }
        console.log("成功删除一条数据")
        client.close()
    })
    //一次删除多条数据
    db.collection("user").deleteOne({"username":"nodejs"},(err)=>{
        if(err){
            console.log(err)
            return
        }
        console.log("成功删除")
        client.close()
    })
})

demo源码