聚合 aggregate

{"name" : "刘德华","sex" : "男","age" : 55,"score":100,"works" : ["爱你一万年", "忘情水", "来生缘", "我不够爱你"]},
{"name" : "张学友","sex" : "男","age" : 55,"score":90,"works" : ["一路上有你", "你好毒", "想和你去吹吹风"]},
{"num" : "3","name" : "黎明", "sex" : "男","age" : 50,"score":88,"works" : ["今夜你会不会来"]},
{ "num" : "4","name" : "郭富城","sex" : "男","age" : 51,"score":70,"works" : ["对你爱不完", "动起来", "我是不是该安静的走开"]},
{"num" : "5","name" : "薛之谦","sex" : "男","age" :33,"score":95,"works" : ["认真的雪"]},
{ "num" : "6","name" : "李宇春","country":"中国","sex" : "女","age" : 32,"score":65,"works" : ["梨花香", "蜀绣"]},
{"num" : "7","name" : "周杰伦","country":"中国","sex" : "男""age" : 37,"score":59,"works" : ["青花瓷","双截棍","七里香","发如雪"]},
{ "num" : "8","name" : "赵丽颖","country":"中国","sex" : "女","age" : 29,"score":69,"works" : ["花千骨插曲不可说"]},
{"num" : "11","name" : "杰克逊","country":"美国","sex" : "男","age" : 51,"score":0,"works" : ["beat it"]},{ 
"num" : "14","name" : "王菲","country":"中国","sex" : "女","age" : 46,"score":70,"works" : ["相约1998", "红豆", "容易受伤的女人"]}

聚合(aggregate)主要用于计算数据,类似sql中的sum()、avg()
语法: db.集合名称.aggregate( [{管道:{表达式}}] )
管道:管道一般用于将当前命令的输出结果作为下一个命令的输入,在mongodb中,管道具有同样的作用,文档处理完毕后,通过管道进行下一次处理。
表达式:处理输入文档并输出
语法:表达式:’$列名’

常用管道
$group:将集合中的文档分组,可用于统计结果
$match:过滤数据,只输出符合条件的文档
$project:修改输入文档的结构,如重命名、增加、删除字段、创建计算结果
$sort:将输入文档排序后输出
$limit:限制聚合管道返回的文档数
$skip:跳过指定数量的文档,并返回余下的文档
$unwind:将数组类型的字段进行拆分
常用表达式(分组-聚合函数)
$sum:分组统计某个字段求和
$avg:分组统计某个字段平均值
$min:分组统计某个字段最新值
$max:分组统计某个字段最大值
$push:将组内所有值组成一个列表
$first:获取分组内第一文档数据
$last:获取分组内最后一个文档数据聚合示例

$group
语法:
		db.集合.aggregate(
			{$group:
				{
					"_id":"$字段名",
					"别名":{$聚会函数:"$字段名"}
				}
			}
		)
将集合中的文档分组,可用于统计结果
_id表示分组的依据,使用某个字段的格式为'$字段'

		示例1:统计男生、女生的总人数
		sql: select count(*) as count from singer group by sex;
		sql: select sum(1) as count from singer group by sex;

		db.singer.aggregate(
			{$group:{
				"_id":"$sex",
				"count":{$sum:1}
			}}
		)


		示例2:求学生总人数、平均年龄

		db.singer.aggregate(
			{$group:
				{
					"_id":null,
					"count":{$sum:1},
					"avgAge":{$avg:"$age"}
				}
			}
		)3:根据性别统计所有同学的名单
		db.singer.aggregate(
			{$group:
				{
					"_id":"$sex",
					"names":{$push:"$name"}
				}
			}
		)

		示例4: 聚合函数统一使用
				$sum:分组统计某个字段求和
				$avg:分组统计某个字段平均值
				$min:分组统计某个字段最新值
				$max:分组统计某个字段最大值
				$push:将组内所有值组成一个列表
				$first:获取分组内第一文档数据
				$last:获取分组内最后一个文档数据

		db.singer.aggregate(
			{$group:
				{
					"_id":"$sex",
					"counter":{$sum:1},
					"avgAge":{$avg:"$age"},
					"maxAge":{$max:"$age"},
					"minAge":{$min:"$age"},
					"names":{$push:"$name"},
					"第一名":{$first:"$name"},
					"最后一名":{$last:"$name"}
				}
			}
		)

$match
用于过滤数据,只输出符合条件的文档
使用MongoDB的标准查询操作

示例: 查找年龄大于50的歌手人数
		db.singer.aggregate(
			{$match:{
				"age":{$gt:50}
			}}
		)

		示例: 统计男,女歌手中年龄大于40的歌手人数
		db.singer.aggregate(
			[
				{$match:{"age":{$gt:40}}},
				{$group:{"_id":"$sex","count":{$sum:1}}}
			]
		)

``$``project 管道, 限定输出的字段
		db.集合.aggregate(
			{$aggregate:{"字段1":1,"字段2":0}}//1表示显示,0表示不显示
		);

		示例:找出年龄大于40的歌手,只显示姓名和年龄
		db.singer.aggregate(
			[
				{$match:{
					"age":{$gt:50}
				}},
				{$project:
					{"_id":0,"name":1,"age":1}
				}
			]
		)

$sort 管道, 排序
db.集合.aggregate(
{$sort:{
“字段名”: 1 | -1 // 1 表示升序 -1 表示降序
}
}
)

	示例:找出年龄大于40的歌手,只显示姓名和年龄, 按照年龄升序排列
	db.singer.aggregate(
		[
			{$match:{
				"age":{$gt:40}
			}},
			{$project:
				{"_id":0,"name":1,"age":1}
			},
			{$sort:
				{"age":1}
			}
		]
	)

$skip,$limit 管道, 跳过n条
db.集合.aggregate(
{$skip:n}
)

	示例:找出年龄大于40的歌手,只显示姓名和年龄, 安装年龄升序排列,跳过前3条,查询3条
	db.singer.aggregate(
		[
			{$match:{
				"age":{$gt:40}
			}},
			{$project:
				{"_id":0,"name":1,"age":1}
			},
			{$sort:
				{"age":1}
			},
			{$skip:3},
			{$limit:3}
		]
	)

$unwind 管道,将数组字段进行拆分
db.集合.aggregate({
$unwind:"$数组字段"
})

   示例: 拆分 works 字段
   db.singer.aggregate([
   	{$match:{"age":{$gt:50}}},
   	{$unwind:"$works"}
   ])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值