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


$multiply (выражение агрегирования)

Оператор $multiply вычисляет продукт числовых выражений и поддерживается в операциях агрегирования. Это полезное средство для получения вычисляемых полей или выполнения арифметики в конвейерах агрегирования.

Синтаксис

{
  $multiply: [ <expression1>, <expression2>, ... ]
}
  • <expression1>: допустимое выражение, разрешающее число.
  • <expression2>: допустимое выражение, разрешающее число.
  • ...: дополнительные выражения, каждое разрешение на число.

Пример

Пример 1. Умножение поля константой

В этом примере показано, как удвоить значение fullSales поля:

db.collection.aggregate([
  {
    $project: {
      sales: 1,
      doubleSales: { $multiply: ["$sales.fullSales", 2] }
    }
  }
])

Результат включает исходное sales поле и новое полеdoubleSales, которое в два раза больше.sales.fullSales При этом будут выведены следующие выходные данные:

[
  { "_id": 1, "sales": { "fullSales": 100 }, "doubleSales": 200 },
  { "_id": 2, "sales": { "fullSales": 250 }, "doubleSales": 500 },
  { "_id": 3, "sales": { "fullSales": 400 }, "doubleSales": 800 }
]

Пример 2. Вычисление общих скидок во время акции

В этом примере вычисляется общая скидка на повышение в категории "DJ Turntables":

db.collection.aggregate([
  {
    $project: {
      promotionEvents: 1,
      totalDiscount: {
        $multiply: [
          { $arrayElemAt: ["$promotionEvents.discounts.discountPercentage", 0] },
          "$sales.salesByCategory.totalSales"
        ]
      }
    }
  }
])

Поле totalDiscount является производным путем умножения первого процента скидки от массива promotionEvents со значением totalSales . При этом будут выведены следующие выходные данные:

[
  {
    "_id": 4,
    "promotionEvents": {
      "discounts": [{ "discountPercentage": 0.10 }]
    },
    "sales": { "salesByCategory": { "totalSales": 5000 } },
    "totalDiscount": 500
  },
  {
    "_id": 5,
    "promotionEvents": {
      "discounts": [{ "discountPercentage": 0.15 }]
    },
    "sales": { "salesByCategory": { "totalSales": 10000 } },
    "totalDiscount": 1500
  }
]

Пример 3. Область вычислений прямоугольника

В этом примере вычисляется область прямоугольника с учетом его width и height:

db.collection.aggregate([
  {
    $project: {
      width: 1,
      height: 1,
      area: { $multiply: ["$dimensions.width", "$dimensions.height"] }
    }
  }
])

Полученное area поле является продуктом прямоугольника width и height. При этом будут выведены следующие выходные данные:

[
  { "_id": 6, "dimensions": { "width": 5, "height": 10 }, "area": 50 },
  { "_id": 7, "dimensions": { "width": 8, "height": 12 }, "area": 96 },
  { "_id": 8, "dimensions": { "width": 3, "height": 7 }, "area": 21 }
]

Ограничения

  • Оператор $multiply работает только с числовыми выражениями. Использование его с нечисловыми значениями приводит к ошибке.
  • Будьте осторожны с проблемами переполнения или точности при работе с большими числами или арифметикой с плавающей запятой.