排序&分页
准备数据
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数据)
Limit与Skip方法
db.集合名.find().sort().skip(数字).limit(数字)
- skip跳过指定数量(可选)
- limit限制查询的数量
使用
.count()
可以统计数量
实例练习
-
跳过0条数据,查询两条
db.c1.find().sort({age:-1}).skip(0).limit(2) db.c1.find().sort({age:-1}).limit(2)
-
跳过两条数据,查询两条数据
db.c1.find().sort({age:-1}).skip(2).limit(2)
-
数据库1-10数据,每页显示两条
db.集合名.find().skip().limit(2)
skip计算公式:(当前页-1)* 每页显示条数
聚合查询
db.聚合名称.aggregate([
{管道:{表达式}}
....
])
常用管道 | 说明 |
---|---|
$group | 将集合中的文档分组,用于统计结果 |
$match | 过滤数据,只要输出符合条件的文档 |
$sort | 聚合数据进一步排序 |
$skip | 跳过指定文档数 |
$limit | 限制集合数据返回文档数 |
常用表达式 | 说明 |
---|---|
$sum | 总和 $sum:1 同count 表示统计 |
$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
键表示按哪一个字段分组,需要显示的列新增字段即可。
-
统计男生、女生的总年龄
db.c1.aggregate([ { $group:{ _id:"$sex", rs:{$sum:"$age"} } } ])
-
统计男生、女生的总人数
db.c1.aggregate([ { $group:{ _id:"$sex", rs:{$sum:1} } } ])
-
求学生总数和平均年龄
db.c1.aggregate([ { $group:{ _id:null, total_num:{$sum:1}, total_avg:{$avg:"$age"} } } ])
-
查询男生、女生人数,按人数升序
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});
}
-
给name添加普通索引
db.c1.createIndex({name:1})
-
删除name索引
db.c1.dropIndex('name_1')
-
给name创建索引并起名webopenfather
db.c1.createIndex({name:1},{name:'webopenfather'})
-
创建复合/组合索引
给name和age添加组合索引
db.c1.createIndex({name:1,age:1})
-
创建唯一索引
db.c1.createIndex(待添加索引的列,{unique:列名})
分析索引(explain)
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权限机制
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数据库中可用,赋予用户所有数据库的读写权限 |
开启验证模式
-
添加超级管理员
use admin db.createUser({ "user" : "root", "pwd": "root", "roles" : [{ role: "root", db: "admin" }] })
-
退出卸载服务
需要使用管理员模式打开终端
mongod --remove
-
重新安装需要输入账号密码的服务
在原安装命令基础上加
--auth
即可mongod --install --dbpath F:\MongoDB\data --logpath F:\MongoDB\logs\mongoDB2.log --auth
-
启动服务
net start mongodb
通过超级管理员账号登陆
-
第一种方式
mongo 服务器IP地址:端口/数据库 -u 用户名 -p 密码
-
第二种方式
- 先登录
- 选择数据库
- 输入
db.auth(用户名,密码)
实例练习
准备数据
use shop;
for(var i=1; i<=10; i++) {
db.goods.insert({"name":"goodsName"+i,"price":i});
}
-
添加用户并设置权限
use shop // 只能读 db.createUser({ "user" : "shop1", "pwd": "shop1", "roles" : [{ role: "read", db: "shop" }] }) // 只能写 db.createUser({ "user" : "shop2", "pwd": "shop2", "roles" : [{ role: "readWrite", db: "shop" }] })
备份还原
备份
mongodump -h -port -u -p -d -o
- -h表示服务器IP地址(不写默认本机)
- -port表示端口(默认27017)
- -u表示账号
- -p表示密码
- -d表示数据库(数据库不写则导出全部)
- -o备份到指定目录ia
-
备份所有数据到
F:\MongoDB\back
mongodump -u root -p root -o F:\MongoDB\back
-
备份指定数据到
F:\MongoDB\back1
mongodump -u shop2 -p shop2 -d shop -o F:\MongoDB\back1
因为数据库是属于shop1与shop2的,因此导出需要使用这两个账号。
还原数据
mongorestore -h -port -u -p --drop -d
- -d 不写则还原全部数据
- –drop表示先删除在导出,不写则覆盖
-
还原所有数据
mongorestore -u root -p root --drop F:\MongoDB\back
-
备份指定数据库
备份指定数据库,不能使用root账户,需要使用有写权限的账户。且需要指定具体文件名。
mongorestore -u shop2 -p shop2 -d shop --drop F:\MongoDB\back1\shop
可视化工具
安装
使用
-
创建链接
-
授权
-
此时可以看到所有数据库
对于可视化工具,我个人更喜欢Navicat