Поделиться через


$top

ПРИМЕНЯЕТСЯ К: Виртуальные ядра MongoDB

Оператор $top аккумулятора возвращает верхний элемент из группы на основе указанного порядка сортировки. Он объединяет сортировку и выделение в одной операции, что делает его эффективным для поиска самых высоких или наименьших значений, не требуя отдельной стадии сортировки.

Синтаксис

Синтаксис для оператора аккумулятора $top выглядит следующим образом:

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

Параметры

Описание
sortBy Задает порядок сортировки с использованием документа с именами полей и направлениями сортировки (1 для возрастания, -1 для убывания).
output Выражение, указывающее поле или значение, возвращаемое из верхнего документа.

Пример

Давайте посмотрим, как использовать пример json из stores набора данных.

{
  "_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
        }
      ]
    }
  ]
}

Пример 1. Получение категории лучших продаж для каждого магазина

Найдите категорию с самым высоким уровнем продаж для каждого магазина.

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"
          }
        }
      }
    }
  }
])

Вы получите выходные данные, показывающие категорию топ-продаж для каждого магазина:

[
  {
    _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 }
  },
.
.
.
]

Пример 2. Получение самой высокой скидки по категории

Найдите категорию с наибольшим процентом скидки для всех мероприятий акции для каждого магазина.

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"
          }
        }
      }
    }
  }
])

Эта категория будет отображаться с наибольшим процентом скидки для каждого магазина:

[
  {
    _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'
    }
  },
.
.
.
]