$group

La $group phase d’agrégation regroupe les documents par expressions d’identificateur spécifiées et applique des expressions d’accumulation pour créer des champs calculés pour chaque groupe. Cette étape est essentielle pour les opérations d’agrégation et de synthèse des données.

Syntaxe

{
  $group: {
    _id: <expression>,
    <field1>: { <accumulator1>: <expression1> },
    <field2>: { <accumulator2>: <expression2> }
  }
}

Paramètres

Paramètre Descriptif
_id Obligatoire. Expression à regrouper. Utilisez null pour calculer les valeurs cumulées pour tous les documents d’entrée.
field Optional. Calculé à l’aide d’opérateurs d’accumulation tels que $sum, $avg, $max, $min, $count, etc.

Examples

Considérez cet exemple de document de la collection des magasins.

{
  "_id": "2cf3f885-9962-4b67-a172-aa9039e9ae2f",
  "name": "First Up Consultants | Bed and Bath Center - South Amir",
  "location": {
    "lat": 60.7954,
    "lon": -142.0012
  },
  "staff": {
    "totalStaff": {
      "fullTime": 18,
      "partTime": 17
    }
  },
  "sales": {
    "totalSales": 37701,
    "salesByCategory": [
      {
        "categoryName": "Mattress Toppers",
        "totalSales": 37701
      }
    ]
  },
  "promotionEvents": [
    {
      "eventName": "Price Drop Palooza",
      "promotionalDates": {
        "startDate": {
          "Year": 2024,
          "Month": 9,
          "Day": 21
        },
        "endDate": {
          "Year": 2024,
          "Month": 9,
          "Day": 30
        }
      },
      "discounts": [
        {
          "categoryName": "Bath Accessories",
          "discountPercentage": 18
        },
        {
          "categoryName": "Pillow Top Mattresses",
          "discountPercentage": 17
        }
      ]
    }
  ]
}

Exemple 1 : Analyse des effectifs de groupe par ville

Cette requête regroupe les magasins par ville et analyse les modèles de dotation entre différents emplacements.

db.stores.aggregate([
  {
    $group: {
      _id: "$city",
      totalFullTimeStaff: { $sum: "$staff.employeeCount.fullTime" },
      totalPartTimeStaff: { $sum: "$staff.employeeCount.partTime" },
      avgFullTimeStaff: { $avg: "$staff.employeeCount.fullTime" },
      storesInCity: { $count: {} }
    }
  },
  {
    $project: {
      city: "$_id",
      totalFullTimeStaff: 1,
      totalPartTimeStaff: 1,
      avgFullTimeStaff: { $round: ["$avgFullTimeStaff", 1] },
      storesInCity: 1,
      fullTimeRatio: {
        $round: [
          { $divide: ["$totalFullTimeStaff", { $add: ["$totalFullTimeStaff", "$totalPartTimeStaff"] }] },
          2
        ]
      }
    }
  },
  { $limit : 2}
])

Les deux premiers résultats retournés par cette requête sont les suivants :

[
  {
    "_id": "New Ellsworth",
    "totalFullTimeStaff": 11,
    "totalPartTimeStaff": 1,
    "avgFullTimeStaff": 11,
    "storesInCity": 1,
    "city": "New Ellsworth",
    "fullTimeRatio": 0.92
  },
  {
    "_id": "Jalonborough",
    "totalFullTimeStaff": 4,
    "totalPartTimeStaff": 1,
    "avgFullTimeStaff": 4,
    "storesInCity": 1,
    "city": "Jalonborough",
    "fullTimeRatio": 0.8
  }
]