On this page
用户偏好数据汇总
在本页面
Data Model
考虑一个假设的体育俱乐部,它的数据库包含一个users
集合,该集合跟踪用户的加入日期,运动偏好,并将这些数据存储在类似于以下内容的文档中:
{
_id : "jane",
joined : ISODate("2011-03-02"),
likes : ["golf", "racquetball"]
}
{
_id : "joe",
joined : ISODate("2012-07-02"),
likes : ["tennis", "golf", "swimming"]
}
对文档进行规范化和排序
以下操作以大写字母 Sequences 返回用户名。聚合包括users
集合中所有文档的用户名。您可以执行此操作以标准化用户名以进行处理。
db.users.aggregate(
[
{ $project : { name:{$toUpper:"$_id"} , _id:0 } },
{ $sort : { name : 1 } }
]
)
users
集合中的所有文档都通过管道,该管道包括以下操作:
聚合的结果类似于以下内容:
{
"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运算符会将此字段加 1.
此聚合操作的结果类似于以下内容:
{
"_id" : {
"month_joined" : 1
},
"number" : 3
},
{
"_id" : {
"month_joined" : 2
},
"number" : 9
},
{
"_id" : {
"month_joined" : 3
},
"number" : 5
}
返回五个最常见的“喜欢”
以下汇总收集了数据集中前五个最“喜欢”的活动。这种类型的分析可以帮助规划和 Future 开发。
db.users.aggregate(
[
{ $unwind : "$likes" },
{ $group : { _id : "$likes" , number : { $sum : 1 } } },
{ $sort : { number : -1 } },
{ $limit : 5 }
]
)
管道以users
集合中的所有文档开始,并通过以下操作传递这些文档:
- $unwind运算符分隔
likes
数组中的每个值,并为数组中的每个元素创建源文档的新版本。
Example
给定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
,这是一个生成的字段。对于包含给定likes
值的每个文档,$sum运算符会将此字段加 1.
$sort运算符按
number
字段的相反 Sequences 对这些文档进行排序。$limit运算符仅包括前 5 个结果文档。
聚合的结果类似于以下内容:
{
"_id" : "golf",
"number" : 33
},
{
"_id" : "racquetball",
"number" : 31
},
{
"_id" : "swimming",
"number" : 24
},
{
"_id" : "handball",
"number" : 19
},
{
"_id" : "tennis",
"number" : 18
}