MongoDB 的聚合框架允许你对数据执行复杂的操作,包括分组、过滤和排序。本章将详细介绍如何使用 MongoDB 的聚合管道来处理数据。
聚合管道简介
聚合管道由一系列文档处理阶段组成,每个阶段都会修改通过管道的数据流。管道处理的数据流类似于 Unix 管道:输入一个文档,经过一系列阶段的处理,最终输出结果文档。这些阶段可以按顺序组合在一起,形成一个聚合管道。
示例
假设我们有一个包含用户评论的集合 reviews
,我们想要找出每个用户的平均评分。
db.reviews.aggregate([ { $group: { _id: "$user_id", averageRating: { $avg: "$rating" } } } ])
在这个示例中,我们使用了 $group
阶段来按 user_id
分组,并计算每个用户的平均评分。
聚合阶段详解
$match
$match
阶段用于过滤出符合特定条件的文档。这与 SQL 查询中的 WHERE 子句类似。
示例
如果我们只想查看评分高于 4 的评论:
db.reviews.aggregate([ { $match: { rating: { $gt: 4 } } }, { $group: { _id: "$user_id", averageRating: { $avg: "$rating" } } } ])
$sort
$sort
阶段用于对输出文档进行排序。可以指定多个字段进行排序,每个字段后跟 1(升序)或 -1(降序)。
示例
如果我们要按用户 ID 升序排列并按评分降序排列:
db.reviews.aggregate([ { $group: { _id: "$user_id", averageRating: { $avg: "$rating" } } }, { $sort: { _id: 1, averageRating: -1 } } ])
$limit
$limit
阶段用于限制返回的文档数量。这对于分页查询非常有用。
示例
如果我们只想查看前 5 个用户的平均评分:
db.reviews.aggregate([ { $group: { _id: "$user_id", averageRating: { $avg: "$rating" } } }, { $sort: { averageRating: -1 } }, { $limit: 5 } ])
$skip
$skip
阶段用于跳过指定数量的文档。通常与 $limit
结合使用,实现分页功能。
示例
如果我们想跳过前 5 个用户的平均评分,然后显示接下来的 5 个用户的平均评分:
db.reviews.aggregate([ { $group: { _id: "$user_id", averageRating: { $avg: "$rating" } } }, { $sort: { averageRating: -1 } }, { $skip: 5 }, { $limit: 5 } ])
$project
$project
阶段用于重定义输出文档的结构。可以用来添加新字段、修改现有字段或删除字段。
示例
如果我们只想保留 user_id
和 averageRating
字段:
db.reviews.aggregate([ { $group: { _id: "$user_id", averageRating: { $avg: "$rating" } } }, { $project: { _id: 0, user_id: "$_id", averageRating: 1 } } ])
$unwind
$unwind
阶段用于将数组字段拆分成多条记录。每个数组元素都会生成一条新的记录。
示例
假设我们有一个包含多个标签的 tags
数组字段,我们希望分别处理每个标签:
db.posts.aggregate([ { $unwind: "$tags" }, { $group: { _id: "$tags", count: { $sum: 1 } } } ])
$lookup
$lookup
阶段用于执行左连接,从另一个集合中获取相关文档。这类似于 SQL 中的 JOIN 操作。
示例
如果我们有一个 users
集合和一个 reviews
集合,我们想要将评论与用户信息关联起来:
-- -------------------- ---- ------- ---------------------- - -------- - ----- -------- ----------- ---------- ------------- ------ --- ------ --- - -------- ------- -- - --------- - -------- -- ----- - - - --
以上便是 MongoDB 聚合框架的核心概念和用法。通过灵活运用这些阶段,你可以轻松地处理和分析复杂的数据集。