MongoDB 聚合操作
-
对文档的高级筛选、统计、等
-
聚合函数:db.collectionName.aggregate()
- 功能:完成聚合操作
- 参数:聚合条件,配合聚合条件使用
- 返回:返回聚合结果
-
常用聚合操作
-
$group: 分组聚合,需要配合 $sum
e.g. 暗中账户类型统计各类账户数量
db.acct.aggregate({ $group:{’_id’:’ $acct_type’,num:{ $sum:1}}}) -
$sum: 对某个域求和
e.g. 统计各类账户余额总和
db.acct.aggregate({
KaTeX parse error: Expected '}', got 'EOF' at end of input: group:{'_id':'acct_type’,
total:{ s u m : ′ sum:' sum:′balance’}
}
})
功能类似于SQL:
select acct_type, sum(balance)
from acct
group by acct_typee.g. 统计所有账户余额总和(不指定分组依据)
db.acct.aggregate({
KaTeX parse error: Expected '}', got 'EOF' at end of input: …id':'', total:{sum:’$balance’}}
})
-
-
$ max: 求最大值
e.g. 找出每类账户中余额最大的账户
db.acct.aggregate({
$ group:{’_id’:’$ acct_type’,
max_bal:{$ max:’$ balance’}
}
}) -
$ min:求最小值(略)
-
$ avg:求平均值
e.g. 求每类账户平均值
db.acct.aggregate({
$ group:{’_id’:’$ acct_type’,
avg_bal:{$ avg:’$balance’}
}
}) -
$ project: 从集合中查询指定域
类似于关系数据库的投影运算
e.g. 从acct集合中查询acct_no,acct_name显示
db.acct.aggregate({
$ project:{’_id’:0,
AcctNo:’$ acct_no’,
AcctName:’$ acct_name’}
})- AcctNo,AcctName为查询结果中显示的名称
_id:0 表示不显示_id域
'$ acct_no’中$ 和单引号不能省略
- AcctNo,AcctName为查询结果中显示的名称
-
$ match: 对数据过滤
e.g. 查询账户余额小于5000的数据
db.acct.aggregate({
$ match:{balance:{$ lt:5000}}
})- 域的名称前不带$符号
-
$ sort: 排序
e.g. 查询所有账户,按照余额倒序排列
db.acct.aggregate({$ sort: {balance:-1}})- 1表示正序排列
-
管道聚合:一个操作处理完成后
将结果传递给下一个操作进行处理
格式:db.collName.aggregate([聚合1,聚合2…])e.g. 将acct集合进行筛选,筛选结果进行排序
db.acct.aggregate(
{$ match:{acct_type:1}},
{$ sort:{acct_no:-1}}
)- acct_type:1中的1表示账户类型的值
acct_no:-1中的-1表示降序排列
- acct_type:1中的1表示账户类型的值
固定集合(Capped Collection)
1)什么是固定集合
- 存储空间大小、存储文档个数有限制
- 我们可以想象成一个环形队列
当集合存储空间用完后
后面存储的数据会覆盖头部的数据
- 特点:
插入速度、顺序查找速度快
能够淘汰早期的数据
可以控制集合大小
- 应用场景:
日志、临时缓存
2)如何创建固定集合
- 语法:
db.createCollection(
collection,
{capped:true, size:1000, max:100}
)
capped:true 表示创建固定集合
size: 集合大小,单位bytes
max: 最大能存放多少笔数据
e.g. 创建最大3笔数据的固定集合
db.createCollection(
“log”,
{capped:true, size:1000, max:3}
)
测试:插入3笔数据,每笔都存入
插入第4笔数据,删除第1笔
- 文件存储
1)两种存储方式- 数据库存路径,文件存磁盘
优点:节约数据库空间
缺点:当存储路径和文件实际路径不一致
则找不到文件 - 将文件直接存入数据库
优点:不存在路径问题
缺点:占用数据库空间
- 数据库存路径,文件存磁盘
2)GridFS: 把文件存入数据库集合中的一种方式
- 实现原理:将文件分成很多小片段(chunk)
读文件将这些小片段组合
- 两个集合:
fs.file:存储跟文件相关的信息
fs.chunks: 存文件数据
- 优点:
同一目录下,没有文件数目限制
能存放较大文件
分布式环境下能自动同步
仅加载部分文件内容到内存中,不必将整个加载
-
缺点:
整体读写效率不如直接从磁盘快
只能整体更换 -
示例:利用mongofiles实现文件存取
第一步:找一个二进制文件
例如/home/tarena/jeans.jpg
第二步:存入,使用命令:
mongofiles -d gridfs put /home/tarena/jeans.jpg
说明: gridfs 存文件的库名称
put 存文件操作
/home/tarena/jeans.jpg 文件路径第三步:删除原文件
rm /home/tarena/jeans.jpg第四步:提取文件
mongofiles -d gridfs get /home/tarena/jeans.jpg- 提取路径要和存入的一致