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


$reduce (выражение массива)

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

Оператор $reduce используется для применения выражения к каждому элементу в массиве и накапливать результаты в одно значение. Этот оператор особенно полезен для выполнения операций, требующих итерации элементов массива и агрегирования их значений.

Синтаксис

$reduce: {
   input: <array>,
   initialValue: <expression>,
   in: <expression>
}

Параметры

Описание
input Массив для итерации.
initialValue Начальное накопительное значение, заданное перед началом итерации массива.
in Допустимое выражение, которое вычисляет накапливаемое значение для каждого элемента в массиве.

Пример

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

{
  "_id": "d3c9df51-41bd-4b4e-a26b-b038d9cf8b45",
  "location": {
    "lat": -67.7571,
    "lon": 97.2505
  },
  "sales": {
    "totalSales": 149849,
    "salesByCategory": [
      {
        "categoryName": "DJ Speakers",
        "totalSales": 36972
      },
      {
        "categoryName": "DJ Headphones",
        "totalSales": 12877
      },
      {
        "categoryName": "Music Accessories",
        "totalSales": 40000
      },
      {
        "categoryName": "DJ Accessories",
        "totalSales": 60000
      }
    ]
  },
  "tag": [
    "#ShopLocal",
    "#FashionStore",
    "#SeasonalSale",
    "#FreeShipping",
    "#MembershipDeals"
  ]
}

Пример 1. Агрегирует значения массива

В этом примере показано, $reduce как суммировать общее количество продаж в разных категориях в массиве salesByCategory .

db.stores.aggregate([
  { $match: { "_id": "988d2dd1-2faa-4072-b420-b91b95cbfd60"} }
, {
    $project: {
      totalSalesByCategory: {
        $reduce: {
          input: "$sales.salesByCategory.totalSales",
          initialValue: 0,
          in: { $add: ["$$value", "$$this"] }
        }
      }
    }
  }
])

Запрос возвращается totalSales по категориям.

{
    "_id": "988d2dd1-2faa-4072-b420-b91b95cbfd60",
    "totalSalesByCategory": 149849
}