排序&分页

准备数据

use test3
db.c1.insert({_id:1,name:"a",sex:1,age:1})
db.c1.insert({_id:2,name:"a",sex:1,age:2})
db.c1.insert({_id:3,name:"b",sex:2,age:3})
db.c1.insert({_id:4,name:"c",sex:2,age:4})
db.c1.insert({_id:5,name:"d",sex:2,age:5})

db.c1.find()

排序

db.集合名.find().sort(JSON数据)

image-20200708154749926

Limit与Skip方法

db.集合名.find().sort().skip(数字).limit(数字)
  • skip跳过指定数量(可选)
  • limit限制查询的数量

使用.count()可以统计数量

image-20200708155902088

实例练习

  1. 跳过0条数据,查询两条

    db.c1.find().sort({age:-1}).skip(0).limit(2)
    db.c1.find().sort({age:-1}).limit(2)

    image-20200708155135127

  2. 跳过两条数据,查询两条数据

    db.c1.find().sort({age:-1}).skip(2).limit(2)

    image-20200708155409337

  3. 数据库1-10数据,每页显示两条

    db.集合名.find().skip().limit(2)

    skip计算公式:(当前页-1)* 每页显示条数

聚合查询

db.聚合名称.aggregate([
    {管道:{表达式}}
    ....
])
常用管道说明
$group将集合中的文档分组,用于统计结果
$match过滤数据,只要输出符合条件的文档
$sort聚合数据进一步排序
$skip跳过指定文档数
$limit限制集合数据返回文档数
常用表达式说明
$sum总和 $sum:1count表示统计
$avg平均
$min最小值
$max最大值

实例练习

准备数据

use test4
db.c1.insert({_id:1,name:"a",sex:1,age:1})
db.c1.insert({_id:2,name:"a",sex:1,age:2})
db.c1.insert({_id:3,name:"b",sex:2,age:3})
db.c1.insert({_id:4,name:"c",sex:2,age:4})
db.c1.insert({_id:5,name:"d",sex:2,age:5})

_id键表示按哪一个字段分组,需要显示的列新增字段即可。

  1. 统计男生、女生的总年龄

    db.c1.aggregate([
        {
            $group:{
            _id:"$sex",
            rs:{$sum:"$age"}
            }
        }
    ])

    image-20200708162849482

  2. 统计男生、女生的总人数

    db.c1.aggregate([
        {
            $group:{
            _id:"$sex",
            rs:{$sum:1}
            }
        }
    ])
  3. 求学生总数和平均年龄

    db.c1.aggregate([
    {
        $group:{
        _id:null,
        total_num:{$sum:1},
        total_avg:{$avg:"$age"}
        }
        }
    ])

    image-20200708163511493

  4. 查询男生、女生人数,按人数升序

    db.c1.aggregate([
        {
            $group:{
            _id:"$sex",
            rs:{$sum:1}
            }
        },
        {
            $sort:{rs:1}
        }
    ])

索引

创建索引

db.集合名.createIndex(带创建索引的列[,额外选项])
  • 带创建索引的列:{键:1,键:-1}

    1表示升序,-1表示降序

  • 额外选项

    设置索引的名称或者唯一索引等等

删除索引

  • 全部删除

    db.集合名.dropIndexes()
  • 删除指定

    db.集合名.dropIndex(索引名)

查看索引语法

db.集合名.getIndexes()

实例练习

数据准备

//选择数据库
use test5;
//向数据库中添加数据
for(var i=0;i<100000;i++){
db.c1.insert({'name':"aaa"+i,"age":i});
}

image-20200708170010949

  1. 给name添加普通索引

    db.c1.createIndex({name:1})

    1585476182255

  2. 删除name索引

    db.c1.dropIndex('name_1')

    image-20200708170307519

  3. 给name创建索引并起名webopenfather

    db.c1.createIndex({name:1},{name:'webopenfather'})

    image-20200708170412526

  4. 创建复合/组合索引

    给name和age添加组合索引

    db.c1.createIndex({name:1,age:1})

    image-20200708170624911

  5. 创建唯一索引

    db.c1.createIndex(待添加索引的列,{unique:列名})

分析索引(explain)

db.集合名.find().explain('executionStats')

1585461681918

COLLSCAN 全表扫描
IXSCAN 索引扫描
FETCH 根据索引去检索指定document

测试:age未添加索引情况
语法:db.c1.find({age:18}).explain(‘executionStats’);

1585477310460

测试:age添加索引情况
语法:db.c1.createIndex({age: 1})
继续:db.c1.find({age:18}).explain(‘executionStats’)
1585477412871

选择规则

  • 为常做条件、排序、分组的字段建立索引

  • 选择唯一性索引

    同值较少如性别字段

  • 选择较小的数据列,为较长的字符串使用前缀索引

    索引文件更小

MongoDB权限机制

db.createUser({ 
    "user" : "账号",
    "pwd": "密码",
    "roles" : [{ 
        role: "角色", 
        db: "所属数据库"
    }] 
})
角色种类说明
超级用户角色root
数据库用户角色readreadWrite
数据库管理角色dbAdminuserAdmin
集群管理角色clusterAdminclusterManagerclusterMonitorhostManager
备份恢复角色backuprestore
所有数据库角色readAnyDatabasereadWriteAnyDatabaseuserAdminAnyDatabasedbAdminAnyDatabase
角色角色说明
root只在admin数据库中可用。超级账号,超级权限;
read允许用户读取指定数据库
readWrite允许用户读写指定数据库
dbAdmin允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile;
dbAdminAnyDatabase只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限
clusterAdmin只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限
userAdmin允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
userAdminAnyDatabase只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
readAnyDatabase只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase只在admin数据库中可用,赋予用户所有数据库的读写权限

开启验证模式

  1. 添加超级管理员

    use admin
    db.createUser({ 
        "user" : "root",
        "pwd": "root",
        "roles" : [{ 
            role: "root", 
            db: "admin"
        }] 
    })

    image-20200708173257120

    image-20200708173457799

  2. 退出卸载服务

    需要使用管理员模式打开终端

    mongod --remove

    image-20200708173734958

  3. 重新安装需要输入账号密码的服务

    在原安装命令基础上加--auth即可

    mongod --install --dbpath F:\MongoDB\data --logpath F:\MongoDB\logs\mongoDB2.log --auth

    image-20200708173918620

  4. 启动服务

    net start mongodb

    image-20200708173935044

通过超级管理员账号登陆

  1. 第一种方式

    mongo 服务器IP地址:端口/数据库 -u 用户名 -p 密码

    image-20200708174319993

  2. 第二种方式

    • 先登录
    • 选择数据库
    • 输入db.auth(用户名,密码)

    image-20200708174425029

实例练习

准备数据

use shop;
for(var i=1; i<=10; i++) {
 db.goods.insert({"name":"goodsName"+i,"price":i});
}
  1. 添加用户并设置权限

    use shop
    
    // 只能读
    db.createUser({ 
        "user" : "shop1",
        "pwd": "shop1",
        "roles" : [{ 
            role: "read", 
            db: "shop"
        }] 
    })
    // 只能写
    db.createUser({ 
        "user" : "shop2",
        "pwd": "shop2",
        "roles" : [{ 
            role: "readWrite", 
            db: "shop"
        }] 
    })

    image-20200708174755182

备份还原

备份

mongodump -h -port -u -p -d -o
  • -h表示服务器IP地址(不写默认本机)
  • -port表示端口(默认27017)
  • -u表示账号
  • -p表示密码
  • -d表示数据库(数据库不写则导出全部)
  • -o备份到指定目录ia
  1. 备份所有数据F:\MongoDB\back

    mongodump -u root -p root -o F:\MongoDB\back

    image-20200708175626591

    image-20200708175638005

  2. 备份指定数据F:\MongoDB\back1

    mongodump -u shop2 -p shop2 -d shop -o F:\MongoDB\back1

    因为数据库是属于shop1与shop2的,因此导出需要使用这两个账号。

    image-20200708180050665

还原数据

mongorestore -h -port -u -p --drop -d
  • -d 不写则还原全部数据
  • –drop表示先删除在导出,不写则覆盖
  1. 还原所有数据

    image-20200708180544852

    mongorestore -u root -p root --drop F:\MongoDB\back

    image-20200708180657258

    image-20200708180708196

  2. 备份指定数据库

    备份指定数据库,不能使用root账户,需要使用有写权限的账户。且需要指定具体文件名。

    mongorestore -u shop2 -p shop2 -d shop --drop F:\MongoDB\back1\shop

    image-20200708181317726

可视化工具

Robo 3T

安装

  1. image-20200708181718492
  2. image-20200708181725531
  3. image-20200708181738210
  4. image-20200708181744557
  5. image-20200708181753490

使用

  1. 创建链接

    image-20200708181900681

  2. 授权

    image-20200708182040323

  3. 此时可以看到所有数据库

    image-20200708182120705

对于可视化工具,我个人更喜欢Navicat