Freigeben über


$top

ANWENDBAR AUF: MongoDB-vCore

Der $top-Akkumulatoroperator gibt das oberste Element aus einer Gruppe basierend auf einer angegebenen Sortierreihenfolge zurück. Es kombiniert Sortier- und Auswahlvorgänge in einem einzigen Vorgang und macht es effizient, die höchsten oder niedrigsten Werte zu finden, ohne dass eine separate Sortierstufe erforderlich ist.

Syntax

Die Syntax für den $top-Akkumulatoroperator lautet wie folgt:

{
  $group: {
    _id: <expression>,
    <field>: { 
      $top: {
        sortBy: { <field1>: <sort order>, <field2>: <sort order>, ... },
        output: <expression>
      }
    }
  }
}

Parameter

BESCHREIBUNG
sortBy Gibt die Sortierreihenfolge mithilfe eines Dokuments mit Feldnamen und Sortieranweisungen an (1 für aufsteigend, -1 für absteigend).
output Der Ausdruck, der das Feld oder den Wert angibt, das bzw. der aus dem obersten Dokument zurückgegeben werden soll.

Beispiel

Lassen Sie uns die Verwendung anhand der JSON-Beispieldatei aus stores-Dataset verstehen.

{
  "_id": "40d6f4d7-50cd-4929-9a07-0a7a133c2e74",
  "name": "Proseware, Inc. | Home Entertainment Hub - East Linwoodbury",
  "sales": {
    "totalSales": 151864,
    "salesByCategory": [
      {
        "categoryName": "Sound Bars",
        "totalSales": 2120
      },
      {
        "categoryName": "Home Theater Projectors",
        "totalSales": 45004
      },
      {
        "categoryName": "Game Controllers",
        "totalSales": 43522
      },
      {
        "categoryName": "Remote Controls",
        "totalSales": 28946
      },
      {
        "categoryName": "VR Games",
        "totalSales": 32272
      }
    ]
  },
  "promotionEvents": [
    {
      "eventName": "Massive Markdown Mania",
      "promotionalDates": {
        "startDate": {
          "Year": 2023,
          "Month": 6,
          "Day": 29
        }
      },
      "discounts": [
        {
          "categoryName": "DVD Players",
          "discountPercentage": 14
        },
        {
          "categoryName": "Televisions",
          "discountPercentage": 22
        }
      ]
    }
  ]
}

Beispiel 1: Abrufen der Top-Verkaufskategorie pro Store

Suchen Sie die am meisten verkaufte Kategorie für jeden Store.

db.stores.aggregate([
  { $unwind: "$sales.salesByCategory" },
  {
    $group: {
      _id: "$_id",
      storeName: { $first: "$name" },
      topSellingCategory: {
        $top: {
          sortBy: { "sales.salesByCategory.totalSales": -1 },
          output: {
            categoryName: "$sales.salesByCategory.categoryName",
            totalSales: "$sales.salesByCategory.totalSales"
          }
        }
      }
    }
  }
])

Dadurch wird eine Ausgabe mit der Top-Verkaufskategorie für jeden Store erzeugt:

[
  {
    _id: 'b1d86d1f-8705-4157-b64c-a9eda0df4921',
    storeName: 'VanArsdel, Ltd. | Baby Products Haven - West Kingfort',
    topSellingCategory: { categoryName: 'Baby Monitors', totalSales: 49585 }
  },
  {
    _id: '22e6367e-8341-415f-9795-118d2b522abf',
    storeName: 'Adatum Corporation | Outdoor Furniture Mart - Port Simone',
    topSellingCategory: { categoryName: 'Outdoor Benches', totalSales: 4976 }
  },
.
.
.
]

Beispiel 2: Abrufen des höchsten Rabatts nach Kategorie

Suchen Sie die Kategorie mit dem höchsten Rabattprozentsatz für alle Werbeaktionen für jeden Store.

db.stores.aggregate([
  { $unwind: "$promotionEvents" },
  { $unwind: "$promotionEvents.discounts" },
  {
    $group: {
      _id: "$_id",
      storeName: { $first: "$name" },
      highestDiscount: {
        $top: {
          sortBy: { "promotionEvents.discounts.discountPercentage": -1 },
          output: {
            categoryName: "$promotionEvents.discounts.categoryName",
            discountPercentage: "$promotionEvents.discounts.discountPercentage",
            eventName: "$promotionEvents.eventName"
          }
        }
      }
    }
  }
])

Dadurch wird die Kategorie mit dem höchsten Rabattprozentsatz für jeden Store angezeigt:

[
  {
    _id: '64ec6589-068a-44a6-be5b-9d37bb0a90f1',
    storeName: 'First Up Consultants | Computer Gallery - West Cathrine',
    highestDiscount: {
      categoryName: 'Gaming Accessories',
      discountPercentage: 24,
      eventName: 'Crazy Markdown Madness'
    }
  },
  {
    _id: 'a58d0356-493b-44e6-afab-260aa3296930',
    storeName: 'Fabrikam, Inc. | Outdoor Furniture Nook - West Lexie',
    highestDiscount: {
      categoryName: 'Fire Pits',
      discountPercentage: 22,
      eventName: 'Savings Showdown'
    }
  },
.
.
.
]