MongoDB 的聚合

MongoDB 的聚合

  • 对数据文档进行整理统计

1、创建聚合

  • 函数:db.collectionName.aggregate()
  • 功能:聚合函数,配合聚合条件进行数据整理

2、$group聚合操作符(分组)

操作符 说明
$sum 求每组文档的个数,或求和
$avg 求每组文档的平均数
$min 求每组文档的最小值
$max 求每组文档的最大值
$first 求每组文档的第一个域的指定值
$max 求每组文档的最后一个域的指定值
db.py.aggregate({$group:{_id:"$model",total:{$sum:1}}})  // 按model域分组并统计文档个数
//   $group  分组
//   _id:"$model"  按照model域进行聚合分组,固定写法,$表示取model域的值,必须用引号
//   total:  统计结果后的新域名为total
//   {$sum:1}   $sum:分组操作符
//   $sum:1  分组后,统计文档个数,乘以1,$sum:10,则统计文档个数后乘以10
{
	"_id" : "mate7",
	"total" : 3   // model 域值为mate7的文档有3个
}
	
db.py.aggregate({$group:{_id:"$model",total:{$sum:"$price"}}})  // 按model域分组按price域进行数值求和
{
	"_id" : "mate7",
	"total" : 12000   // model 域值为mate7的price之和为12000
}

db.py.aggregate({$group:{_id:"$model",total:{$avg:"$price"}}}) // 按model域分组按price域进行数值求平均数
{
	"_id" : "mate7",
	"total" : 4000   // model 域值为mate7的price平均数为12000
}

3、$project聚合操作符(修饰文档的显示结构)

db.py.aggregate({$project:{_id:0,model:1,price:1}})
// 查询结果不显示_id域,只显示model和price域,同find函数的field参数
{
	"model" : "mate 20",
	"price" : 5500
}

db.py.aggregate({$project:{_id:0,MODEL:"$model",PRICE:"$price"}})
// 查询结果不显示_id域,只显示model和price域,并且显示的域名可自定义,$表示取model域的值,必须用引号
{
	"MODEL" : "mate 8",
	"PRICE" : 3500
},

4、$match聚合操作符(过滤数据)

db.student.aggregate({$match:{stu_ID:"2019023105"}})
// 查找stu_ID为2019023105的文档,相当于find函数的query参数

db.student.aggregate({$match:{stu_age:{$lt:18}}})
// 查找stu_age小于18的文档

5、$limit聚合操作符(显示前几条数据)

db.student.aggregate([{$match:{stu_age:{$lt:20}}},{$limit:2}])
// 查找stu_age小于20的文档,并显示前两条

6、$skip聚合操作符(跳过前几条数据显示)

db.student.aggregate([{$match:{stu_age:{$lt:20}}},{$skip:1}])
// 查找stu_age小于20的文档,并跳过第一条文档显示

7、$sort聚合操作符(排序)

db.student.aggregate({$sort:{stu_age:1}})
// 按照stu_age的值升序排序

8、聚合管道

  • 前一个聚合操作的结果给后一个聚合操作执行
  • 格式:将多个聚合操作放在一个中括号内
db.student.aggregate([
						{$match:{stu_sex:"w"}}, // 过滤
						{$sort:{stu_age:1}},    // 排序
						{$limit:2}				// 显示
					])
// 查找女同学年纪最小的两位
发布了75 篇原创文章 · 获赞 87 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43883022/article/details/89414001