如何在MongoDB中实现分组和统计查询?

在 MongoDB 中,可以使用聚合管道中的 $group 阶段实现分组和统计查询。
$group 的基本语法为:

{ $group: { 
   <key>: <expression>, 
   <accumulator1>: { <accumulator1_operator>: <expression1> },
   ...  
} }
  • 表示分组的字段
  • 表示累加器,用于统计值计算
  • 表示累加器操作符,如 $sum, $avg 等
  • 表示用于计算的表达式

示例:

  1. 根据 category 字段分组,计算每个分类的总价格:
db.products.aggregate([
   { 
     $group: {
        _id: "$category",   // group by category
        total: { $sum: "$price" } // sum up prices
     }
   }
]) 

输出:

{ "_id" : "Food", "total" : 100 }
{ "_id" : "Drink", "total" : 210 }
  1. 根据 year 字段分组,计算每个年份的订单数量:
db.orders.aggregate([
   { 
     $group: {
       _id: "$year",   // group by year
       count: { $sum: 1 }  // sum 1 for each document
     }
   }
])

输出:

{ "_id" : 2020, "count" : 50 }
{ "_id" : 2021, "count" : 60 }
  1. 根据 category 和 year 两字段分组,计算每个分类每个年份的销售总额:
db.products.aggregate([
   { 
     $group: {
       _id: { category: "$category", year: "$year" },  
       total: { $sum: "$price" }  
     }
   } 
])

输出:

{ "_id" : { "category" : "Food", "year" : 2020 }, "total" : 500 }
{ "_id" : { "category" : "Drink", "year" : 2020 }, "total" : 350 }
{ "_id" : { "category" : "Food", "year" : 2021 }, "total" : 600 }
{ "_id" : { "category" : "Drink", "year" : 2021 }, "total" : 400 }  

所以,$group 阶段通过分组和累加器,可以让我们在 MongoDB 中实现各种强大的统计和分析查询。