前言
在进行数据库操作时,聚合统计操作是非常常见的需求。Mongoose 是 Node.js 中最流行的 MongoDB 驱动程序之一,它提供了丰富的聚合统计操作。其中,$group 是最常用的聚合操作之一,它可以对数据进行分组统计,并返回聚合结果。
本文将详细介绍 Mongoose 中如何使用 $group 实现聚合统计操作,包括如何定义聚合管道、如何使用 $group 进行分组统计、如何使用 $sum、$avg、$min、$max 等操作符进行计算,以及如何使用 $project 对结果进行投影等。
示例数据
为了方便演示,我们使用以下示例数据:
-- -------------------- ---- ------- ----- -------- - -------------------- -------------------------------------------- - ---------------- ---- --- ----- ------ - ---------------- ----- ---------- - --- -------- ------ - ----- ------- --------- ---- -- ------- - ----- ------- --------- ---- -- ------ - ----- ------- --------- ---- -- ------------ - ----- ----- --------- ---- -- --------- - ----- ------- --------- ---- -- --- ----- ---- - ---------------------- ------------ ----- ----- - - - ------ ----------- -------- ------- --------- -- ------- ------ --- ------------ --- ------------------- --------- ------- -- - ------ ----------- ---- ------- ------- ---------- ------ --- ------------ --- ------------------- --------- ------- -- - ------ ----------- ------ ------- -------- ----------- ------ --- ------------ --- ------------------- --------- ------- -- - ------ -------- ---- ------- ------ ---------- ------ --- ------------ --- ------------------- --------- ---- ---- -- - ------ ----- --------- ------- ----- ------ --- ------------ --- ------------------- --------- ---- ---- -- - ------ -------- ---- ------- ----- -------- ------ --- ------------ --- ------------------- --------- ------ -- -- ----- -------- ------ - ----- -------------------- ----- ----------------------- - -------
这里定义了一个 Book 模型,包含 title、author、price、publishDate、category 等字段。我们插入了 6 条图书数据,其中包括 3 本编程语言类书籍、2 本 Web 开发类书籍和 1 本数据库类书籍。
定义聚合管道
在 Mongoose 中,聚合操作通过聚合管道(Aggregation Pipeline)实现。聚合管道是一系列操作符组成的数组,每个操作符都代表一个聚合操作,数据会按照操作符的顺序进行处理,最终返回聚合结果。
下面是一个简单的聚合管道示例:
-- -------------------- ---- ------- ----- -------- - - - ------- - --------- ------ - -- - ------- - ---- ---------- ------ - ----- - - - -- - --------- - ---- -- ------- ------- ------ - - -- -- -------------------------------------- -- - -------------------- ---
这个聚合管道包含三个操作符:$match、$group 和 $project。它的作用是统计所有编程语言类图书的作者及其图书数量,并将结果投影为 { author: '作者名', count: 数量 } 的形式。
使用 $group 进行分组统计
$group 操作符是聚合管道中最常用的操作符之一,它可以对数据进行分组统计,并返回聚合结果。$group 操作符的基本语法如下:
{ $group: { _id: <expression>, <field1>: { <accumulator1>: <expression1> }, ... } }
其中,_id 表示分组字段,可以是任意一个表达式,如果设置为 null,则表示对所有数据进行聚合;<field1> 表示计算结果字段,可以是任意一个字段名;<accumulator1> 表示计算方式,可以是 $sum、$avg、$min、$max 等操作符;<expression1> 表示计算表达式,可以是任意一个表达式。
下面是一个 $group 操作符的示例:
const pipeline = [ { $match: { category: '编程语言' } }, { $group: { _id: '$author', count: { $sum: 1 } } }, ]; Book.aggregate(pipeline).then((result) => { console.log(result); });
这个聚合操作的作用是统计所有编程语言类图书的作者及其图书数量。首先使用 $match 过滤出所有编程语言类图书,然后使用 $group 操作符按照作者进行分组统计,使用 $sum 操作符计算每个作者的图书数量,并将结果保存到 count 字段中。最终返回的结果为一个数组,每个元素包含 _id 和 count 两个字段,_id 表示作者名,count 表示图书数量。
使用 $sum、$avg、$min、$max 等操作符进行计算
除了 $sum 操作符之外,$avg、$min、$max 等操作符也是非常常用的操作符。它们可以分别计算字段的平均值、最小值、最大值等。
下面是一个使用 $avg 操作符计算图书价格平均值的示例:
const pipeline = [ { $match: { category: '编程语言' } }, { $group: { _id: '$category', avgPrice: { $avg: '$price' } } }, ]; Book.aggregate(pipeline).then((result) => { console.log(result); });
这个聚合操作的作用是统计所有编程语言类图书的价格平均值。首先使用 $match 过滤出所有编程语言类图书,然后使用 $group 操作符按照类别进行分组统计,使用 $avg 操作符计算价格的平均值,并将结果保存到 avgPrice 字段中。最终返回的结果为一个数组,每个元素包含 _id 和 avgPrice 两个字段,_id 表示类别名,avgPrice 表示价格平均值。
使用 $project 对结果进行投影
$project 操作符可以对聚合结果进行投影,即选择需要的字段进行返回。$project 操作符的基本语法如下:
{ $project: { <field1>: <1|0>, <field2>: <1|0>, ... } }
其中,<field1>、<field2> 等表示需要选择的字段,<1|0> 表示是否选择该字段,1 表示选择该字段,0 表示不选择该字段。
下面是一个使用 $project 对聚合结果进行投影的示例:
-- -------------------- ---- ------- ----- -------- - - - ------- - --------- ------ - -- - ------- - ---- ------------ --------- - ----- -------- - - -- - --------- - ---- -- --------- ------- --------- - - -- -- -------------------------------------- -- - -------------------- ---
这个聚合操作的作用是统计所有编程语言类图书的价格平均值,并将结果投影为 { category: '类别名', avgPrice: 平均价格 } 的形式。首先使用 $match 过滤出所有编程语言类图书,然后使用 $group 操作符按照类别进行分组统计,使用 $avg 操作符计算价格的平均值,并将结果保存到 avgPrice 字段中。最后使用 $project 操作符投影结果,选择 category 和 avgPrice 两个字段进行返回,并将 _id 字段设为 0,表示不返回该字段。
总结
本文详细介绍了 Mongoose 中如何使用 $group 实现聚合统计操作,包括如何定义聚合管道、如何使用 $group 进行分组统计、如何使用 $sum、$avg、$min、$max 等操作符进行计算,以及如何使用 $project 对结果进行投影等。通过本文的学习,您应该能够熟练地使用 $group 进行聚合统计操作,为您的应用程序提供更加丰富的功能。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6627a21ac9431a720c452750