limit 和 skip
其中stu表为笔者的集合,读者应用时应换成自己的
limit 限制显示条数
db.stu.find().limit(2)
skip 跳过记录数
db.stu.find().skip(1)
【重点】如果limit和skip同时使用,先skip后limit不管先后顺序
db.stu.find().limit(2).skip(1)
db.stu.find().skip(1).limit(2)
投影
设置显示字段
设置显示方式(投影),设置为 1 表示字段显示,没有设置表示不显示,_id 默认显示,如果想让他不显示可以设置成 0
db.stu.find(
// 查询条件
{},
// 设置显示方式(投影)
{
_id:0,
name:1
}
)
排序
排序条件:1升序,-1降序
db.stu.find().sort(
// 排序条件
{
age:-1,
gender:1
}
)
统计个数
// 方式一
db.stu.find({}).count()
// 方式二
db.stu.count()
消除重复
db.stu.distinct(
// 去重字段
'hometown',
// 查询条件
{
age:{$gt:15}
}
)
聚合操作
find 用于查询数据,聚合(aggregate)主要用于计算数据和统计数据
语法
db.集合名称.aggregate([
{管道类型 : {表达式}},
{管道类型 : {表达式}},
{管道类型 : {表达式}},
...
])
管道类型
- List item
$group作用 按照某个字段进行分组,针对每组进行表达式计算
db.stu.aggregate([
{
$group : {
// 第一个参数必须是 _id,传递的是字段名称之前必须添加$,如果想要所有数据作为一组可以把参数设置成 null
_id:"null",//"$gender",
// 表达式计算
// "按照家乡记录总个数":{$sum:1},
// 计算平均值
// "平均年龄":{$avg:"$age"},
// 计算最大值
"最大年龄":{$max:"$age"},
// 计算最小值
"最小年龄":{$min:"$age"}
// 把某个字段放入的统计列表中
// "统计字段数据":{$push:"$$ROOT"}
}
}
])
$match 匹配出符合条件的数据,
db.stu.aggregate([
// 匹配出大于20岁的记录
{
$match : {
// 和 find 参数一样
// 匹配条件
age:{$gt:20}
}
},
// 进匹配出的记录进行分组,获取所有的分组名称
{
$group: {
_id:"$hometown",
"名称":{$push:"$name"}
}
}
])
$project跟投影一样
db.stu.aggregate([
// 匹配出大于20岁的记录
{
$match : {
// 和 find 参数一样
// 匹配条件
age:{$gt:20}
}
},
// 利用投影显示记录
{
$project: {
// 参数和 投影参数一样
name:1,
_id:0
}
}
])
$ sort对数据进行排序
db.stu.aggregate([
// 匹配出大于20岁的记录
{
$match : {
// 和 find 参数一样
// 匹配条件
age:{$gt:20}
}
},
{
$sort:{
// 参数和查询排序参数一样
age:-1
}
}
])
$ limit 和 $skip
【注意】在管道中 $limit 和 $skip 有先后顺序
db.stu.aggregate([
// 匹配出大于20岁的记录
{
$match : {
// 和 find 参数一样
// 匹配条件
age:{$gt:16}
}
},
{
$skip:1
},
{
$limit:2
}
])
$unwind 作用是按照字段列表进行拆分数据,默认情况下管道会自动过滤 数组为空,null,不存在的字段数据,如果想不过滤设置 preserveNullAndEmptyArrays 为 true
db.t3.aggregate([
{
$unwind:"$size"
}
])
// 不过滤数据
db.t3.aggregate([
{
$unwind:{
// 设置拆分字段
"path":'$size',
// 不过滤数据
preserveNullAndEmptyArrays:true
}
}
])
用于管道计算的表达式
- $sum对数据进行累加操作
- $avg平均值
- $min最小值
- $max最大值
- $ push把某个字段放入的统计列表中,关键词$$ROOT表示整条数据
- $first第一条
- $last最后一条
索引
创建索引
db.t1.ensureIndex(
// name 索引字段 值 1 升序,-1 降序
{name:1},
// 设置唯一索引,默认不是唯一索引
// unique 是去重的方式之一
{"unique":true}
)
查询索引
db.t1.getIndexes()
删除索引
// 最好使用查询索引获取
db.t1.dropIndex('索引名称')
备份与恢复
备份
mongodump -h dbhost -d dbname -o dbdirectory
恢复
mongorestore -h dbhost -d dbname --dir dbdirectory
扩展备份写法(小服务器备份)
1.写一个 sh 脚本文件
mysqldump -uroot -p123456 数据库名 | gzip > /backups/bk_$(date +%Y%m%d_%H%M%S).sql.gz
mongodump -h dbhost -d dbname -o dbdirectory
2.利用 crontab 定时执行
验证模式
mongodb 默认情况下是没有任何限制的
开启验证模式
- 在执行时携带 --auth
- 在配置文件中配置 auth=true
实现验证模式
1.如果没有root账号必须先创建一个root账号,一旦创建成功账户系统立刻启动
// 进入管理员数据库
use admin
// 创建root账号
db.createUser(
{
"user":"python",
"pwd":"123456",
// 设置角色为 root
"roles":["root"]
}
)
2.管理员登录
use admin
// 如果返回1 表示登录成功
db.auth('用户名','密码')
3.创建其他有权限的账号
// 必须管理员登录
use admin
db.createUser(
{
"user":"db01",
"pwd":"123456",
// 设置权限账号
"roles":[
{
// 设置允许访问数据库名称
"db":"db_01",
// 访问数据库权限 read,write,readWrite
"role":"readWrite"
}
]
}
)
db.createUser(
{
"user":"db02",
"pwd":"123456",
// 设置权限账号
"roles":[
{
// 设置允许访问数据库名称
"db":"db_02",
// 访问数据库权限 read,write,readWrite
"role":"readWrite"
}
]
}
)
4.查看用户列表
// 必须管理员登录
use admin
show users
5.普通用户登录
use admin
db.auth('用户名','密码')
6.删除用户
// 必须管理员登录
use admin
// 已被废弃
db.removeUser('用户名')
// 推荐使用
db.dropUser('用户名')