在 MongoDB 中,聚合管道是一种非常强大的数据处理工具,可以用来对集合中的数据进行各种复杂的数据分析和处理。本文将详细介绍 MongoDB 聚合管道的基本概念、语法和常用操作,并提供实例代码用于演示。
基本概念
MongoDB 聚合管道是一个操作符序列,每个操作符都会对输入数据进行一些特定的操作,最终输出一个结果集合。输入数据可以是一个集合中的所有文档,也可以是一个由其他聚合管道操作符生成的数据集合。
MongoDB 提供了多种聚合管道操作符,其中有些操作符仅在特定版本的 MongoDB 中可用。下面是一些常用的聚合管道操作符:
$match:对集合中的文档进行筛选,只输出符合条件的文档。$sort:对输入的文档进行排序操作,可以按照一个或多个字段进行排序。$group:按照指定的字段对输入文档进行分组,计算每个分组内的统计数据。$skip:跳过前面指定数量的文档,输出剩余的文档。$limit:指定输出文档的数量限制。$project:对输入文档进行投影操作,只输出指定的字段。
聚合管道语法
MongoDB 聚合管道操作符都是以 $ 开头的字符串,后面跟着具体的操作符名称和参数列表,例如:
db.collection.aggregate([
{ $match: { status: "A" } },
{ $group: { _id: "$cust_id", total: { $sum: "$amount" } } }
])上面的语法中,$match、$group 都是聚合管道操作符,{ status: "A" } 和 { _id: "$cust_id", total: { $sum: "$amount" } } 则是具体的操作参数。
常用聚合管道操作
$match
$match 操作符可以用来筛选集合中符合指定条件的文档,语法格式如下:
{ $match: { <query> } }其中 <query> 是一个 BSON 文件,用来指定文档的筛选条件,例如:
db.collection.aggregate([
{ $match: { status: "A" } }
])上面的代码会输出集合中所有 status 字段等于 "A" 的文档。
$sort
$sort 操作符可以用来对输入文档进行排序操作,可以按照一个或多个字段进行排序,语法格式如下:
{ $sort: { <field1>: <sort_order1>, <field2>: <sort_order2>, ... } }其中 <field> 是按照哪个字段进行排序,<sort_order> 则是排序的方式,可以是 1 表示升序,或 -1 表示降序。例如:
db.collection.aggregate([
{ $sort: { age: -1 } }
])上面的代码会输出按照 age 字段降序排序后的文档。
$group
$group 操作符可以用来按照指定字段对输入文档进行分组,语法格式如下:
{ $group: { _id: <expression>, <field1>: { <accumulator1> }, ... } }其中 _id 是分组字段,<expression> 是一个表达式,用来指定分组的依据。<accumulator> 则是用来计算分组统计数据的函数,例如:
db.collection.aggregate([
{ $group: { _id: "$cust_id", total: { $sum: "$amount" } } }
])上面的代码会按照 cust_id 字段对输入文档进行分组,并计算每个分组内 amount 字段的总和。
$skip 和 $limit
$skip 和 $limit 操作符可以用来控制输出文档数量,分别用于跳过前面指定数量的文档和输出指定数量的文档,语法格式如下:
{ $skip: <n> }
{ $limit: <n> }其中 <n> 表示需要跳过或输出的文档数量。例如:
db.collection.aggregate([
{ $skip: 5 },
{ $limit: 10 }
])上面的代码会跳过集合中前面的 5 个文档,并输出接下来的 10 个文档。
$project
$project 操作符可以用来从输入文档中选择指定的字段进行输出,语法格式如下:
{ $project: { <field1>: <value>, <field2>: <value>, ... } }其中 <field> 是输出的字段名,<value> 则是输出的字段值表达式。例如:
db.collection.aggregate([
{ $project: { _id: 0, name: 1, age: 1 } }
])上面的代码会从输入文档中选择 _id、name 和 age 三个字段进行输出。
$lookup
$lookup 操作符可以用来从另外一张表中查询数据并与当前表做关联,语法格式如下:
{ $lookup: {
from: < 集合名称 >,
localField: < 当前集合关联字段 >,
foreignField: < 外表关联字段 >,
as: < 查询结果别名 >
} }例如:
// www.javascriptcn.com code example
db.getCollection('orders').aggregate([
{
$lookup: {
from: "customers",
localField: "cust_id",
foreignField: "_id",
as: "customer"
}
}
])上面的代码会在 orders 表中查找 cust_id 字段对应的 customers 表中 _id 字段,并将查询结果放在 customer 字段中。
示例代码
下面是一个综合应用了多个聚合管道操作的代码示例:
// www.javascriptcn.com code example
db.getCollection('orders').aggregate([
{ $match: { status: "A" } },
{ $group: { _id: "$cust_id", total: { $sum: "$amount" } } },
{ $sort: { total: -1 } },
{ $limit: 5 },
{
$lookup: {
from: "customers",
localField: "_id",
foreignField: "_id",
as: "customer"
}
},
{ $project: { _id: 0, name: "$customer.name", total: 1 } }
])上面的代码会从 orders 表中查找出 status 字段为 "A" 的订单,并按照 cust_id 分组并计算每个分组的 amount 字段的总和,然后按照 total 字段对分组结果排序,选取前 5 条数据,再从 customers 表中查找出对应的 name 字段并输出。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d6361aa941bf7134be6642