MongoDB数据库学习-聚集-对用户的爱好进行聚集。
对用户的爱好进行聚集
一个假想的运动俱乐部,它有个数据库,其中有个users集合,用来跟踪用户的加入日期、运动爱好,按如下格式保存在文档中:
{
_id : "jane", joined : ISODate("2011-03-02"), likes : ["golf", "racquetball"]}
{
_id : "joe", joined : ISODate("2012-07-02"), likes : ["tennis", "golf", "swimming"]}
标准化文档和排序
下面的操作按字母顺序返回大写的用户名。该聚集操作包含users集合中所有文档中的用户名。你可能需要这样做来标准化用户名,以作处理:
db.users.aggregate( [ {
$project : {
name:{
$toUpper:"$_id"}
, _id:0 }
}
, {
$sort : {
name : 1 }
}
])
users文档中的所有集合通过由以下操作组成的文档:
$project操作符:
创建一个叫做name的新字段
用$toUpper操作符把_id字段的值转变成大写
然后$project创建一个叫做name的新字段来保存它的值。
不输出_id字段。$project默认会传输_id字段,除非显式抑制。$sort操作符按name字段对结果进行排序。
聚集结果类似下面的形式:
{
"name" : "JANE"}
,{
"name" : "JILL"}
,{
"name" : "JOE"}
按加入的月份排序返回用户名
下面的聚集操作按用户加入的月份返回用户名。这种聚集操作可以用来帮助生成会员续费通知。
db.users.aggregate( [ {
$project : {
month_joined : {
$month : "$joined" }
, name : "$_id", _id : 0 }
}
, {
$sort : {
month_joined : 1 }
}
])
该管道把users文档中的所有文档通过以下操作:
$project操作符:创建了两个新字段:month_joined和name。 从结果中抑制_id字段输出。aggregate()方法会包含_id字段,除非显式抑制。 $month操作符把joined字段的值转换成整数表示的月份。$project操作符把这些值赋值给month_joined字段。 $sort操作符按month_joined字段对结果排序。
该操作返回类似下面的结果:
{
"month_joined" : 1, "name" : "ruth"}
,{
"month_joined" : 1, "name" : "harold"}
,{
"month_joined" : 1, "name" : "kate"}
{
"month_joined" : 2, "name" : "jill"}
返回每个月的加入总人数
以下操作显示每月有多少人加入。你可以把这个聚集用于招募和营销策略上。
db.users.aggregate( [ {
$project : {
month_joined : {
$month : "$joined" }
}
}
, {
$group : {
_id : {
month_joined:"$month_joined"}
, number : {
$sum : 1 }
}
}
, {
$sort : {
"_id.month_joined" : 1 }
}
])
该管道把users集合中的所有文档通过如下操作:
$project操作符创建了一个叫做month_joined的字段。 $month操作符把joined字段的值转换成整数表示的月份。然后,$project操作符把值赋给month_joined字段。 $group操作符把有month_joined字段值的文档收集在一起,并统计那个值有多少个文档。特别地,对于每个唯一的值,$group创建了一个新的“每月”文档,这个文档有两个字段:_id字段,包含一个有month_joined字段的嵌套文档 number字段,这是一个生成的字段。对于每个包含给定month_joined值的文档,$sum操作符会把这个字段的值加一. $sort操作符根据month_joined字段的内容对$group产生的文档进行排序。
该聚集操作的结果类似下面的形式:
{
"_id" : {
"month_joined" : 1 }
, "number" : 3}
,{
"_id" : {
"month_joined" : 2 }
, "number" : 9}
,{
"_id" : {
"month_joined" : 3 }
, "number" : 5}
返回前五个最常见的“爱好”
下面的聚集收集数据集中前5个最受欢迎的活动。该分析可有助于安排计划和未来发展。
db.users.aggregate( [ {
$unwind : "$likes" }
, {
$group : {
_id : "$likes" , number : {
$sum : 1 }
}
}
, {
$sort : {
number : -1 }
}
, {
$limit : 5 }
])
该聚集以users集合中的所以后文档开始,把它们通过以下操作:
$unwind操作符把likes数组中的每个值分开,对数组中的每个元素创建一个新版本的文档。
例如:
给定下面来自users集合的文档:
{
_id : "jane", joined : ISODate("2011-03-02"), likes : ["golf", "racquetball"]}$unwind操作符将会创建下面的文档:
{
_id : "jane", joined : ISODate("2011-03-02"), likes : "golf"}
{
_id : "jane", joined : ISODate("2011-03-02"), likes : "racquetball"}
$group操作符把有相同likes字段值的文档收集起来,对每个分组统计。$group创建了有两个字段的新文档:
_id,包含likes的值 number,是一个生成的字段。$sum操作符对每个包含给定likes值的文档,会对number字段加一。$sort操作符按number字段的降序对文档排序。
$limit操作符只包含结果中的前5个文档。
聚集结果类似下面的形式:
{
"_id" : "golf", "number" : 33}
,{
"_id" : "racquetball", "number" : 31}
,{
"_id" : "swimming", "number" : 24}
,{
"_id" : "handball", "number" : 19}
,{
"_id" : "tennis", "number" : 18}