三、MongoDB高级操作

2020-07-09 15:42:47 浏览数 (1)

排序&分页

准备数据

代码语言:javascript复制
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()

排序

代码语言:javascript复制
db.集合名.find().sort(JSON数据)

Limit与Skip方法

代码语言:javascript复制
db.集合名.find().sort().skip(数字).limit(数字)
  • skip跳过指定数量(可选)
  • limit限制查询的数量

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

实例练习

  1. 跳过0条数据,查询两条 db.c1.find().sort({age:-1}).skip(0).limit(2) db.c1.find().sort({age:-1}).limit(2)
  1. 跳过两条数据,查询两条数据 db.c1.find().sort({age:-1}).skip(2).limit(2)
  1. 数据库1-10数据,每页显示两条 db.集合名.find().skip().limit(2)skip计算公式:(当前页-1)* 每页显示条数

聚合查询

代码语言:javascript复制
db.聚合名称.aggregate([
    {管道:{表达式}}
    ....
])

常用管道

说明

$group

将集合中的文档分组,用于统计结果

$match

过滤数据,只要输出符合条件的文档

$sort

聚合数据进一步排序

$skip

跳过指定文档数

$limit

限制集合数据返回文档数

常用表达式

说明

$sum

总和 $sum:1同count表示统计

$avg

平均

$min

最小值

$max

最大值

实例练习

准备数据

代码语言:javascript复制
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. 统计男生、女生的总年龄12345678db.c1.aggregate([ { group:{ _id:"sum:"
  2. 统计男生、女生的总人数12345678db.c1.aggregate([ { group:{ _id:"
  3. 求学生总数和平均年龄123456789db.c1.aggregate([{ group:{ _id:null, total_num:{sum:1}, total_avg:{avg:"
  4. 查询男生、女生人数,按人数升序1234567891011db.c1.aggregate([ { group:{ _id:"sum:1} } }, { sort:{rs:1} }])

索引

创建索引

代码语言:javascript复制
db.集合名.createIndex(带创建索引的列[,额外选项])
  • 带创建索引的列:{键:1,键:-1} 1表示升序,-1表示降序
  • 额外选项 设置索引的名称或者唯一索引等等

删除索引

  • 全部删除 db.集合名.dropIndexes()
  • 删除指定 db.集合名.dropIndex(索引名)

查看索引语法

代码语言:javascript复制
db.集合名.getIndexes()

实例练习

数据准备

代码语言:javascript复制
//选择数据库
use test5;
//向数据库中添加数据
for(var i=0;i<100000;i  ){
db.c1.insert({'name':"aaa" i,"age":i});
}
  1. 给name添加普通索引 db.c1.createIndex({name:1})
  1. 删除name索引 db.c1.dropIndex('name_1')
  1. 给name创建索引并起名webopenfather db.c1.createIndex({name:1},{name:'webopenfather'})
  1. 创建复合/组合索引 给name和age添加组合索引 db.c1.createIndex({name:1,age:1})
  1. 创建唯一索引 db.c1.createIndex(待添加索引的列,{unique:列名})

分析索引(explain)

代码语言:javascript复制
db.集合名.find().explain('executionStats')

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

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

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

选择规则

  • 为常做条件、排序、分组的字段建立索引
  • 选择唯一性索引 同值较少如性别字段
  • 选择较小的数据列,为较长的字符串使用前缀索引 索引文件更小

MongoDB权限机制

代码语言:javascript复制
db.createUser({ 
    "user" : "账号",
    "pwd": "密码",
    "roles" : [{ 
        role: "角色", 
        db: "所属数据库"
    }] 
})

角色种类

说明

超级用户角色

root

数据库用户角色

read、readWrite

数据库管理角色

dbAdmin、userAdmin

集群管理角色

clusterAdmin、clusterManager、clusterMonitor、hostManager

备份恢复角色

backup、restore

所有数据库角色

readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase

角色

角色说明

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" }] })
  1. 退出卸载服务 需要使用管理员模式打开终端 mongod --remove
  1. 重新安装需要输入账号密码的服务 在原安装命令基础上加--auth即可 mongod --install --dbpath F:MongoDBdata --logpath F:MongoDBlogsmongoDB2.log --auth
  1. 启动服务 net start mongodb

通过超级管理员账号登陆

  1. 第一种方式 mongo 服务器IP地址:端口/数据库 -u 用户名 -p 密码
  1. 第二种方式
    • 先登录
    • 选择数据库
    • 输入db.auth(用户名,密码)

实例练习

准备数据

代码语言:javascript复制
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" }] })

备份还原

备份

代码语言:javascript复制
mongodump -h -port -u -p -d -o
  • -h表示服务器IP地址(不写默认本机)
  • -port表示端口(默认27017)
  • -u表示账号
  • -p表示密码
  • -d表示数据库(数据库不写则导出全部)
  • -o备份到指定目录ia
  1. 备份所有数据F:MongoDBback mongodump -u root -p root -o F:MongoDBback
  1. 备份指定数据F:MongoDBback1 mongodump -u shop2 -p shop2 -d shop -o F:MongoDBback1因为数据库是属于shop1与shop2的,因此导出需要使用这两个账号。

还原数据

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

mongorestore -u root -p root --drop F:MongoDBback

  1. 备份指定数据库 备份指定数据库,不能使用root账户,需要使用有写权限的账户。且需要指定具体文件名。 mongorestore -u shop2 -p shop2 -d shop --drop F:MongoDBback1shop

可视化工具

Robo 3T

安装

使用

  1. 创建链接
  1. 授权
  1. 此时可以看到所有数据库

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

0 人点赞