与用户偏好数据聚合
数据模型
考虑一个包含以下内容的运动俱乐部数据库: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 } ]