文章目录
前言
在 MongoDB 里,aggregate
方法是一个强大的工具,用于对集合中的文档进行聚合处理,它可以执行筛选、分组、排序、计算等一系列操作。以下是对其 API 详细使用的介绍:
基本语法
db.collection.aggregate(pipeline, options);
collection
:代表要进行聚合操作的集合名称。pipeline
:是一个由多个聚合阶段(stage)组成的数组,每个阶段会按照顺序依次对文档进行处理。options
(可选):是一个包含聚合操作选项的文档,例如allowDiskUse
允许在聚合过程中使用磁盘空间来处理大量数据。
常见聚合阶段及示例
1. $match
阶段
此阶段用于筛选文档,只有符合指定条件的文档才会进入下一个阶段。
// 查询 orders 集合中 totalAmount 大于 100 的文档
db.orders.aggregate([
{
$match: { totalAmount: { $gt: 100 } }
}
]);
2. $project
阶段
该阶段用于选择要返回的字段,还能对字段进行重命名、计算等操作。
// 从 users 集合中选择 name 和 age 字段,并将 name 重命名为 fullName
db.users.aggregate([
{
$project: {
fullName: "$name",
age: 1
}
}
]);
3. $group
阶段
这个阶段可将文档按照指定的键进行分组,同时可以对每个组执行聚合操作,像求和、计数等。
// 按 category 字段对 products 集合分组,并统计每个组的文档数量
db.products.aggregate([
{
$group: {
_id: "$category",
count: { $sum: 1 }
}
}
]);
4. $sort
阶段
用于对文档进行排序,1
表示升序,-1
表示降序。
// 对 sales 集合按 totalSales 字段降序排序
db.sales.aggregate([
{
$sort: { totalSales: -1 }
}
]);
5. $limit
阶段
用于限制返回的文档数量。
// 从 customers 集合中返回前 5 个文档
db.customers.aggregate([
{
$limit: 5
}
]);
6. $skip
阶段
该阶段用于跳过指定数量的文档。
// 跳过 customers 集合中的前 3 个文档,返回剩余的文档
db.customers.aggregate([
{
$skip: 3
}
]);
7. $unwind
阶段
将数组字段中的每个元素拆分为一个单独的文档。
// 假设 orders 集合中的每个文档有一个 items 数组字段,将其拆分为单独的文档
db.orders.aggregate([
{
$unwind: "$items"
}
]);
8. $lookup
阶段
用于在多个集合之间进行连接操作,类似于 SQL 中的 JOIN
。
// 假设 orders 集合和 customers 集合,通过 customerId 字段进行连接
db.orders.aggregate([
{
$lookup: {
from: "customers",
localField: "customerId",
foreignField: "_id",
as: "customerDetails"
}
}
]);
综合示例
假设存在 orders
集合,文档结构如下:
[
{ "_id": 1, "product": "apple", "quantity": 10, "price": 2 },
{ "_id": 2, "product": "banana", "quantity": 20, "price": 1 },
{ "_id": 3, "product": "apple", "quantity": 5, "price": 2 }
]
现在要统计每种产品的总销售额,并按总销售额降序排序:
db.orders.aggregate([
{
// 计算每个订单的销售额
$project: {
product: 1,
totalPrice: { $multiply: ["$quantity", "$price"] }
}
},
{
// 按产品分组,计算总销售额
$group: {
_id: "$product",
totalSales: { $sum: "$totalPrice" }
}
},
{
// 按总销售额降序排序
$sort: { totalSales: -1 }
}
]);
选项说明
以下是一些常见的 options
参数:
allowDiskUse
:当聚合操作的数据量很大时,允许使用磁盘空间来处理数据,避免内存不足的问题。
db.collection.aggregate(pipeline, { allowDiskUse: true });
explain
:返回聚合操作的执行计划,用于分析和优化查询性能。
db.collection.aggregate(pipeline, { explain: true });
通过组合不同的聚合阶段和使用合适的选项,可以实现复杂的数据分析和处理任务。