{"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"}
])