注册

详解MongoDB的group_one()函数:对集合中的文档进行分组,并返回第一个文档

MongoDB group_one() 函数的作用与使用方法

作用

MongoDB的group_one()函数是用于集合聚合操作的一个聚合管道阶段。

group_one()函数的作用是将输入的文档按指定的字段值进行分组,返回每个分组的聚合结果。

使用方法

group_one() 函数的使用方法如下:

db.collection.aggregate([
  {
    $group: {
       _id: ,  // 用于分组的字段或表达式
       : {  :  },
       ...
       : {  :  }
    }
  }
])

其中,_id 字段是必须要指定的,用于指定用来分组的字段或表达式。

field1 ~ fieldN 是分组后要输出的聚合结果的字段名,accumulator1 ~ accumulatorN 是指定对于该字段进行聚合的操作,expression1 ~ expressionN 则是指定在执行聚合操作前对该字段进行的表达式操作。

示例

下面提供两个例子来展示 group_one() 函数的使用方法。

假设我们有一个 orders 集合,存储了订单的信息:

{
  "_id": ObjectId("5fc9c8715e73d5d7b5ca5b5c"),
  "product": "A",
  "price": 10,
  "quantity": 5,
  "created_at": ISODate("2020-12-04T12:00:00Z")
},
{
  "_id": ObjectId("5fc9c87e5e73d5d7b5ca5b5d"),
  "product": "B",
  "price": 5,
  "quantity": 3,
  "created_at": ISODate("2020-12-04T12:00:00Z")
},
{
  "_id": ObjectId("5fc9c8a75e73d5d7b5ca5b5e"),
  "product": "A",
  "price": 15,
  "quantity": 2,
  "created_at": ISODate("2020-12-05T12:00:00Z")
},
{
  "_id": ObjectId("5fc9c8af5e73d5d7b5ca5b5f"),
  "product": "C",
  "price": 20,
  "quantity": 1,
  "created_at": ISODate("2020-12-05T12:00:00Z")
}

示例一:按商品名称分组统计销售总额

db.orders.aggregate([
  {
    $group: {
       _id: "$product",
       revenue: { $sum: { $multiply: [ "$price", "$quantity" ] } }
    }
  }
])

运行结果为:

{ "_id" : "A", "revenue" : 80 }
{ "_id" : "B", "revenue" : 15 }
{ "_id" : "C", "revenue" : 20 }

说明:按照商品名称进行分组,然后通过 revenue 字段输出各组的销售总额。

示例二:按日期分组统计销售总额,只统计12月4日的数据

db.orders.aggregate([
  {
    $match: {
      created_at: {
        $gte: ISODate("2020-12-04T00:00:00Z"),
        $lt: ISODate("2020-12-05T00:00:00Z")
      }
    }
  },
  {
    $group: {
      _id: null,
      revenue: { $sum: { $multiply: [ "$price", "$quantity" ] } }
    }
  }
])

运行结果为:

{ "_id" : null, "revenue" : 55 }

说明:首先使用 $match 管道操作筛选出日期大于等于 2020-12-04 且小于2020-12-05 的数据,然后使用 $group 管道操作将这些数据进行分组并统计销售总额,同时 _id 字段设置为 null,表示不按任何字段进行分组,只统计整个集合的销售总额。