进入MongoDB中文手册(4.2版本)目录
1 数据模型
考虑一个假设的体育俱乐部,它的数据库包含一个跟踪用户加入日期,运动偏好的users集合,并将这些数据存储在类似于以下内容的文档中:
{
_id : "jane",
joined : ISODate("2011-03-02"),
likes : ["golf", "racquetball"]
}
{
_id : "joe",
joined : ISODate("2012-07-02"),
likes : ["tennis", "golf", "swimming"]
}
2 文档的规范化和排序
以下操作以大写字母顺序返回用户名。聚合包括users集合中所有文档的用户名。您可以执行此操作来在规范用户名的基础上进行处理。
db.users.aggregate(
[
{ $project : { name:{$toUpper:"$_id"} , _id:0 } },
{ $sort : { name : 1 } }
]
)
users集合中的所有文档都通过管道,该管道包括以下操作:
- $project运算符
- 创建一个名为name的新字段。
- 使用$toUpper运算符将_id的值转换为大写 。然后,$project创建一个新字段,命名为name来保存该值。
- $sort运算符根据name字段对结果排序
聚合的结果类似于以下内容:
{
"name" : "JANE"
},
{
"name" : "JILL"
},
{
"name" : "JOE"
}
3 返回按加入月份排序的文档
以下聚合操作返回按加入月份排序的用户名。这种聚合可以帮助产生成员更新通知。
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字段。
- $sor运算符通过month_joined字段对结果排序 。
该操作返回类似于以下内容的结果:
{
"month_joined" : 1,
"name" : "ruth"
},
{
"month_joined" : 1,
"name" : "harold"
},
{
"month_joined" : 1,
"name" : "kate"
}
{
"month_joined" : 2,
"name" : "jill"
}
4 返回每月的加入总数
以下操作显示一年中每个月有多少人加入。您可以将这些汇总数据用于招聘和营销策略。
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使用两个字段创建一个新的“每月(per-month)”文档:
- _id,其中包含带有该month_joined字段及其值的嵌套文档
- number,这是一个生成的字段。$sum运输符对于每个包含给定month_joined值的文档,对该字段增加1 。
- $sort运算符对这些文档排序,这些文档由$group根据month_joined字段的内容创建的。
此聚合操作的结果类似于以下内容:
{
"_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集合中的以下文档:
$unwind运算符将创建下列文件:{ _id : "jane", joined : ISODate("2011-03-02"), likes : ["golf", "racquetball"] }
{ _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值的文档,对该字段增加1 。
- $sort运算符通过number字段对这些文档以降序的方式排序。
聚合的结果类似于以下内容:
{
"_id" : "golf",
"number" : 33
},
{
"_id" : "racquetball",
"number" : 31
},
{
"_id" : "swimming",
"number" : 24
},
{
"_id" : "handball",
"number" : 19
},
{
"_id" : "tennis",
"number" : 18
}