MongoDB Query 分组查询

在使用 MongoDB 进行数据查询时,除了常规的查询操作,还经常需要进行分组查询,以便对数据进行统计和分析。本文将介绍 MongoDB 中的分组查询操作,并附带代码示例。

什么是分组查询?

分组查询是指将一组文档按照指定字段进行分组,并对每个分组进行统计或聚合操作。例如,对于一个存储用户数据的集合,我们可以根据用户所在的城市进行分组,并统计每个城市的用户数。

在 MongoDB 中,分组查询使用聚合管道(Aggregation Pipeline)来实现。聚合管道可以将多个操作按序连接起来,以对数据进行处理和转换。

分组查询的语法

聚合管道的基本语法如下:

db.collection.aggregate([
  { $match: { <查询条件> } },
  { $group: {
    _id: <分组字段>,
    <统计字段>: { <聚合操作>: <表达式> },
    ...
  }},
  { $project: { <字段1>: 1, <字段2>: 1, ... } }
])

其中,$match 用于选择需要进行分组的文档,$group 用于按指定字段进行分组并进行统计,$project 用于对结果进行投影,即选择需要返回的字段。

示例

考虑一个存储商品销售记录的集合 sales,每个文档包含字段 product(商品名称)、quantity(销售数量)和 price(销售单价)。

我们可以按商品名称进行分组,并计算每个商品的销售总量和总销售额。以下是一个示例代码:

db.sales.aggregate([
  { $group: {
    _id: "$product",
    totalQuantity: { $sum: "$quantity" },
    totalPrice: { $sum: { $multiply: ["$quantity", "$price"] } }
  }},
  { $project: {
    _id: 0,
    product: "$_id",
    totalQuantity: 1,
    totalPrice: 1
  }}
])

上述代码将按商品名称进行分组,并使用 $sum 操作符计算每个商品的总销售数量和总销售额。在 $project 阶段,将结果中的 _id 字段重命名为 product,并只返回 producttotalQuantitytotalPrice 字段。

以下是示例结果:

product totalQuantity totalPrice
Apple 100 500
Banana 200 300
Orange 150 450

这样,我们就以商品名称进行了分组查询,并得到了每个商品的销售统计信息。

总结

分组查询是 MongoDB 中常用的操作之一,可以对数据进行统计和聚合。使用聚合管道的方式可以实现灵活的分组查询,并通过投影操作选择需要返回的字段。

本文介绍了 MongoDB 分组查询的基本语法和示例代码,希望对初学者理解分组查询有所帮助。

参考资料:

  • [MongoDB Manual: Aggregation](