在 MongoDB 的聚合框架中,$group 操作是非常常用的操作之一,它可以将数据按照指定的字段进行分组,并对每个分组进行聚合操作。本文将介绍 $group 操作的使用技巧,并通过示例代码演示其实践应用。
$group 操作的基本语法
$group 操作的语法如下:
db.collection.aggregate([ { $group: { _id: <expression>, // 分组字段 <field1>: { <accumulator1> : <expression1> }, ... } } ])
其中,_id 表示分组的字段,可以是一个表达式或者字段名。field1 表示需要聚合的字段,accumulator1 表示聚合操作,expression1 表示参与聚合的表达式。
$group 操作的实践技巧
1. 使用多个字段进行分组
在 $group 操作中,可以使用多个字段进行分组,只需要在 _id 字段中传入多个字段即可。例如:
db.sales.aggregate([ { $group: { _id: { month: { $month: "$date" }, year: { $year: "$date" } }, totalSales: { $sum: "$amount" } } } ])
以上代码将 sales 集合按照年份和月份进行分组,并计算每个分组的总销售额。
2. 使用表达式进行分组
$group 操作中的 _id 字段可以接受任意表达式,因此可以使用表达式进行分组。例如:
db.sales.aggregate([ { $group: { _id: { $substrCP: ["$sku", 0, 1] }, totalSales: { $sum: "$amount" } } } ])
以上代码将 sales 集合按照商品编号的首字母进行分组,并计算每个分组的总销售额。
3. 使用聚合操作进行计算
$group 操作中可以使用多种聚合操作进行计算,例如 $sum、$avg、$min、$max 等等。例如:
// javascriptcn.com 代码示例 db.sales.aggregate([ { $group: { _id: { $substrCP: ["$sku", 0, 1] }, totalSales: { $sum: "$amount" }, avgPrice: { $avg: "$price" } } } ])
以上代码将 sales 集合按照商品编号的首字母进行分组,并计算每个分组的总销售额和平均价格。
4. 使用管道操作进行多级分组
在 $group 操作中,可以使用管道操作进行多级分组。例如:
// javascriptcn.com 代码示例 db.sales.aggregate([ { $group: { _id: { month: { $month: "$date" }, year: { $year: "$date" } }, totalSales: { $sum: "$amount" } } }, { $group: { _id: "$_id.year", yearlySales: { $push: { month: "$_id.month", sales: "$totalSales" } } } } ])
以上代码将 sales 集合按照年份和月份进行分组,并计算每个分组的总销售额。然后在第二个 $group 操作中,将每一年的数据合并到一个数组中。
示例代码
为了更好地理解 $group 操作的实践应用,以下是一个示例代码:
// javascriptcn.com 代码示例 // 创建 sales 集合 db.createCollection("sales") // 插入数据 db.sales.insertMany([ { date: ISODate("2022-01-01"), sku: "A001", price: 100, amount: 10 }, { date: ISODate("2022-01-02"), sku: "A002", price: 200, amount: 5 }, { date: ISODate("2022-02-01"), sku: "B001", price: 150, amount: 8 }, { date: ISODate("2022-02-02"), sku: "B002", price: 250, amount: 3 }, { date: ISODate("2022-03-01"), sku: "C001", price: 120, amount: 12 }, { date: ISODate("2022-03-02"), sku: "C002", price: 220, amount: 7 } ]) // 按照年份和月份进行分组,并计算每个分组的总销售额和平均价格 db.sales.aggregate([ { $group: { _id: { month: { $month: "$date" }, year: { $year: "$date" } }, totalSales: { $sum: "$amount" }, avgPrice: { $avg: "$price" } } } ])
以上代码将 sales 集合按照年份和月份进行分组,并计算每个分组的总销售额和平均价格。执行结果如下:
{ "_id" : { "month" : 3, "year" : 2022 }, "totalSales" : 19, "avgPrice" : 170 } { "_id" : { "month" : 2, "year" : 2022 }, "totalSales" : 11, "avgPrice" : 200 } { "_id" : { "month" : 1, "year" : 2022 }, "totalSales" : 15, "avgPrice" : 150 }
总结
$group 操作是 MongoDB 聚合框架中非常常用的操作之一,可以将数据按照指定字段进行分组,并对每个分组进行聚合操作。在实践中,我们可以使用多个字段、表达式、聚合操作和管道操作进行多级分组,以满足不同的业务需求。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/650bd30b95b1f8cacd5e499b