与用户偏好数据聚合
数据模型
考虑一个包含以下内容的运动俱乐部数据库:members
集合跟踪成员的姓名、加入日期和运动偏好
db.members.insertMany( [ { _id: "jane", joined: ISODate("2011-03-02"), likes: ["golf", "racquetball"] }, { _id: "joe", joined: ISODate("2012-07-02"), likes: ["tennis", "golf", "swimming"] }, { _id: "ruth", joined: ISODate("2012-01-14"), likes: ["golf", "racquetball"] }, { _id: "harold", joined: ISODate("2012-01-21"), likes: ["handball", "golf", "racquetball"] }, { _id: "kate", joined: ISODate("2012-01-14"), likes: ["swimming", "tennis"] } ] )
返回单个字段
以下操作使用$project
仅返回 _id
字段,用于 members
集合中的所有文档
db.members.aggregate( [ { $project: { _id: 1 } } ] )
该操作返回以下文档
[ { _id: 'jane' }, { _id: 'joe' }, { _id: 'ruth' }, { _id: 'harold' }, { _id: 'kate' } ]
对于基本的查询和投影操作,使用 find()
方法的标准查询具有最佳性能。
规范和排序文档
以下操作返回按字母顺序排列的成员名称。您可能会这样做来规范化成员名称以便处理。
db.members.aggregate( [ { $project: { name: { $toUpper: "$_id" }, _id: 0 } }, { $sort: { name: 1 } } ] )
所有来自 members
集合的文档都通过以下操作组成的管道
该操作返回以下结果
[ { name: 'HAROLD' }, { name: 'JANE' }, { name: 'JOE' }, { name: 'KATE' }, { name: 'RUTH' } ]
按加入月份排序的用户名
以下聚合操作返回按加入月份排序的成员名称。您可能可以使用此聚合操作来帮助生成会员续费通知。
db.members.aggregate( [ { $project: { month_joined: { $month: "$joined" }, name: "$_id", _id: 0 } }, { $sort: { month_joined: 1 } } ] )
管道将 members
集合中的所有文档通过以下操作
$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: 3, name: 'jane' }, { month_joined: 7, name: 'joe' } ]
返回每月的连接总数
以下操作展示了每年每月有多少人加入。您可能可以使用这些聚合数据用于招聘和营销策略。
db.members.aggregate( [ { $project: { month_joined: { $month: "$joined" } } } , { $group: { _id: { month_joined: "$month_joined" } , number: { $sum: 1 } } }, { $sort: { "_id.month_joined": 1 } } ] )
管道将 members
集合中的所有文档通过以下操作
$project
操作符创建一个新的名为 `month_joined
` 的字段。$month
操作符将 `joined
` 字段的值转换为月份的整数表示。然后 `$project
` 操作符将这些值分配给 `month_joined
` 字段。$group
操作符收集所有具有给定 `month_joined
` 值的文档,并计算该值的文档数量。具体来说,对于每个唯一值,`$group
` 创建一个新的 "每月" 文档,包含两个字段_id
,它包含一个嵌套文档,其中包含 `month_joined
` 字段及其值。number
,这是一个生成的字段。`$sum
` 操作符在包含给定 `month_joined
` 值的每个文档中将此字段增加1。
聚合操作返回以下文档
[ { _id: { month_joined: 1 }, number: 3 }, { _id: { month_joined: 3 }, number: 1 }, { _id: { month_joined: 7 }, number: 1 } ]
返回最常见的五个“点赞”
以下聚合操作收集数据集中“点赞”次数最多的前五个活动。此类分析有助于制定计划和未来发展。
db.members.aggregate( [ { $unwind: "$likes" }, { $group: { _id: "$likes" , number: { $sum: 1 } } }, { $sort: { number: -1 } }, { $limit: 5 } ] )
管道从members
集合中的所有文档开始,并通过以下操作处理这些文档
$unwind
运算符将likes
数组中的每个值分开,并为数组中的每个元素创建一个新的源文档。示例
以下来自
members
集合的文档{ _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
值的每个文档时,它会将此字段增加1。
$sort
运算符按相反顺序对文档进行排序。$limit
运算符仅包含前5个结果文档。
聚合操作返回以下文档
[ { _id: 'golf', number: 4 }, { _id: 'racquetball', number: 3 }, { _id: 'tennis', number: 2 }, { _id: 'swimming', number: 2 }, { _id: 'handball', number: 1 } ]