前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >三、MongoDB高级操作

三、MongoDB高级操作

作者头像
Dreamy.TZK
发布2020-07-09 15:42:47
1.6K0
发布2020-07-09 15:42:47
举报
文章被收录于专栏:小康的自留地小康的自留地

排序&分页

准备数据

代码语言: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数据)
image-20200708154749926
image-20200708154749926

Limit与Skip方法

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

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

image-20200708155902088
image-20200708155902088

实例练习

  1. 跳过0条数据,查询两条 db.c1.find().sort({age:-1}).skip(0).limit(2) db.c1.find().sort({age:-1}).limit(2)
image-20200708155135127
image-20200708155135127
  1. 跳过两条数据,查询两条数据 db.c1.find().sort({age:-1}).skip(2).limit(2)
image-20200708155409337
image-20200708155409337
  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});
}
image-20200708170010949
image-20200708170010949
  1. 给name添加普通索引 db.c1.createIndex({name:1})
1585476182255
1585476182255
  1. 删除name索引 db.c1.dropIndex('name_1')
image-20200708170307519
image-20200708170307519
  1. 给name创建索引并起名webopenfather db.c1.createIndex({name:1},{name:'webopenfather'})
image-20200708170412526
image-20200708170412526
  1. 创建复合/组合索引 给name和age添加组合索引 db.c1.createIndex({name:1,age:1})
image-20200708170624911
image-20200708170624911
  1. 创建唯一索引 db.c1.createIndex(待添加索引的列,{unique:列名})

分析索引(explain)

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

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

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

1585477310460
1585477310460

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

1585477412871
1585477412871

选择规则

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

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

通过超级管理员账号登陆

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

实例练习

准备数据

代码语言: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" }] })
image-20200708174755182
image-20200708174755182

备份还原

备份

代码语言:javascript
复制
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-20200708175626591
image-20200708175638005
image-20200708175638005
  1. 备份指定数据F:\MongoDB\back1 mongodump -u shop2 -p shop2 -d shop -o F:\MongoDB\back1因为数据库是属于shop1与shop2的,因此导出需要使用这两个账号。
image-20200708180050665
image-20200708180050665

还原数据

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

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

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

可视化工具

Robo 3T

安装

image-20200708181718492
image-20200708181718492
image-20200708181725531
image-20200708181725531
image-20200708181738210
image-20200708181738210
image-20200708181744557
image-20200708181744557
image-20200708181753490
image-20200708181753490

使用

  1. 创建链接
image-20200708181900681
image-20200708181900681
  1. 授权
image-20200708182040323
image-20200708182040323
  1. 此时可以看到所有数据库
image-20200708182120705
image-20200708182120705

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-07-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 排序&分页
    • 排序
      • Limit与Skip方法
        • 实例练习
        • 聚合查询
          • 实例练习
          • 索引
            • 实例练习
              • 分析索引(explain)
                • 选择规则
                • MongoDB权限机制
                  • 开启验证模式
                    • 通过超级管理员账号登陆
                      • 实例练习
                      • 备份还原
                        • 备份
                          • 还原数据
                          • 可视化工具
                            • 安装
                              • 使用
                              相关产品与服务
                              云数据库 MongoDB
                              腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
                              领券
                              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档