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


$facet (агрегирование)

Область применения: Виртуальные ядра MongoDB

Конвейеры $facet агрегирования этапов позволяют выполнять несколько параллельных агрегатов в рамках одного этапа конвейера. Это полезно для выполнения нескольких анализов одного набора данных в одном запросе.

Синтаксис

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

{
  "$facet": {
    "outputField1": [ { "stage1": {} }, { "stage2": {} } ],
    "outputField2": [ { "stage1": {} }, { "stage2": {} } ]
  }
}

Параметры

Описание
outputFieldN Имя поля вывода.
stageN Этап агрегирования, который необходимо выполнить.

Пример

Пример обращается ко всем связанным записям к таким категориям продуктов, как Laptops, SmartphonesCameras и Watches из stores коллекции.

Пример 1. Фасетный поиск по продажам и рекламным акциям

В примере используется $facet этап для одновременного анализа продаж и рекламных акций для указанных категорий продуктов. Конвейер salesAnalysis раскручивает , фильтрует salesByCategoryдля определенных категорий и группирует их для суммирования totalSales. Конвейер анализа продвижения раскручивает рекламные мероприятия и их скидки, фильтры для определенных категорий, таких как Laptops, Smartphones и т. д., и группирует их, чтобы вычислить средний процент скидки. Входные документы из stores коллекции извлекаются из базы данных только один раз в начале этой операции.

db.stores.aggregate([
  {
    $facet: {
      salesAnalysis: [
        { $unwind: "$sales.salesByCategory" },
        { $match: { "sales.salesByCategory.categoryName": { $in: ["Laptops", "Smartphones", "Cameras", "Watches"] } } },
        { $group: { _id: "$sales.salesByCategory.categoryName", totalSales: { $sum: "$sales.salesByCategory.totalSales" } } }
      ],
      promotionAnalysis: [
        { $unwind: "$promotionEvents" },
        { $unwind: "$promotionEvents.discounts" },
        { $match: { "promotionEvents.discounts.categoryName": { $in: ["Laptops", "Smartphones", "Cameras", "Watches"] } } },
        { $group: { _id: "$promotionEvents.discounts.categoryName", avgDiscount: { $avg: "$promotionEvents.discounts.discountPercentage" } } }
      ]
    }
  }
]).pretty();

Возвращаемые выходные данные из запроса отображают агрегированные аналитические сведения.

{
  "salesAnalysis": [
    { "_id": "Smartphones", "totalSales": 440815 },
    { "_id": "Laptops", "totalSales": 679453 },
    { "_id": "Cameras", "totalSales": 481171 },
    { "_id": "Watches", "totalSales": 492299 }
  ],
  "promotionAnalysis": [
    { "_id": "Smartphones", "avgDiscount": 14.32 },
    { "_id": "Laptops", "avgDiscount": 14.780645161290323 },
    { "_id": "Cameras", "avgDiscount": 15.512195121951219 },
    { "_id": "Watches", "avgDiscount": 15.174418604651162 }
  ]
}