排序&分页

准备数据

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数据)

mongoDB高并发问题加锁 mongodb高级用法_字段

Limit与Skip方法

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

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

mongoDB高并发问题加锁 mongodb高级用法_mongoDB高并发问题加锁_02

实例练习

  1. 跳过0条数据,查询两条
db.c1.find().sort({age:-1}).skip(0).limit(2)
db.c1.find().sort({age:-1}).limit(2)

mongoDB高并发问题加锁 mongodb高级用法_数据_03

  1. 跳过两条数据,查询两条数据
db.c1.find().sort({age:-1}).skip(2).limit(2)

mongoDB高并发问题加锁 mongodb高级用法_mongoDB高并发问题加锁_04

  1. 数据库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"}
        }
    }
])

mongoDB高并发问题加锁 mongodb高级用法_mongoDB高并发问题加锁_05

  1. 统计男生、女生的总人数
db.c1.aggregate([
    {
        $group:{
        _id:"$sex",
        rs:{$sum:1}
        }
    }
])
  1. 求学生总数和平均年龄
db.c1.aggregate([
{
    $group:{
    _id:null,
    total_num:{$sum:1},
    total_avg:{$avg:"$age"}
    }
    }
])

mongoDB高并发问题加锁 mongodb高级用法_数据库_06

  1. 查询男生、女生人数,按人数升序
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});
}

mongoDB高并发问题加锁 mongodb高级用法_数据_07

  1. 给name添加普通索引
db.c1.createIndex({name:1})

mongoDB高并发问题加锁 mongodb高级用法_数据_08

  1. 删除name索引
db.c1.dropIndex('name_1')

mongoDB高并发问题加锁 mongodb高级用法_数据_09

  1. 给name创建索引并起名webopenfather
db.c1.createIndex({name:1},{name:'webopenfather'})

mongoDB高并发问题加锁 mongodb高级用法_数据库_10

  1. 创建复合/组合索引
    给name和age添加组合索引
db.c1.createIndex({name:1,age:1})

mongoDB高并发问题加锁 mongodb高级用法_数据库_11

  1. 创建唯一索引
db.c1.createIndex(待添加索引的列,{unique:列名})

分析索引(explain)

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

mongoDB高并发问题加锁 mongodb高级用法_数据库_12

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

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

mongoDB高并发问题加锁 mongodb高级用法_mongoDB高并发问题加锁_13

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

mongoDB高并发问题加锁 mongodb高级用法_字段_14

选择规则

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

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"
    }] 
})

mongoDB高并发问题加锁 mongodb高级用法_mongoDB高并发问题加锁_15

mongoDB高并发问题加锁 mongodb高级用法_数据库_16

  1. 退出卸载服务
    需要使用管理员模式打开终端
mongod --remove

mongoDB高并发问题加锁 mongodb高级用法_字段_17

  1. 重新安装需要输入账号密码的服务
    在原安装命令基础上加--auth即可
mongod --install --dbpath F:\MongoDB\data --logpath F:\MongoDB\logs\mongoDB2.log --auth

mongoDB高并发问题加锁 mongodb高级用法_mongoDB高并发问题加锁_18

  1. 启动服务
net start mongodb

mongoDB高并发问题加锁 mongodb高级用法_数据库_19

通过超级管理员账号登陆

  1. 第一种方式
mongo 服务器IP地址:端口/数据库 -u 用户名 -p 密码

mongoDB高并发问题加锁 mongodb高级用法_字段_20

  1. 第二种方式
  • 先登录
  • 选择数据库
  • 输入db.auth(用户名,密码)

mongoDB高并发问题加锁 mongodb高级用法_mongoDB高并发问题加锁_21

实例练习

准备数据

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"
    }] 
})

mongoDB高并发问题加锁 mongodb高级用法_mongoDB高并发问题加锁_22

备份还原

备份

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

mongoDB高并发问题加锁 mongodb高级用法_mongoDB高并发问题加锁_23

mongoDB高并发问题加锁 mongodb高级用法_mongoDB高并发问题加锁_24

  1. 备份指定数据F:\MongoDB\back1
mongodump -u shop2 -p shop2 -d shop -o F:\MongoDB\back1

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

mongoDB高并发问题加锁 mongodb高级用法_字段_25

还原数据

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

mongoDB高并发问题加锁 mongodb高级用法_数据_26

mongoDB高并发问题加锁 mongodb高级用法_数据_27

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

mongoDB高并发问题加锁 mongodb高级用法_字段_28

可视化工具

Robo 3T

安装



使用

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

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