Как рассчитать средневзвешенное значение в mongoDB с использованием структуры агрегации?

Мне нужно рассчитать средневзвешенное значение по набору документов. Каждый документ содержит вес и значение в отдельном поле. Вот пример: у меня есть следующие 2 документа, представляющие транзакцию продажи.

{
    quantity : 3,
    price : 2
}

{
    quantity : 9,
    price : 6
}

Я хочу найти среднюю цену для обеих транзакций. Это средневзвешенное значение, где вес - это количество, а значение - это цена. Это можно рассчитать по

AveragePrice = (3 * 2 + 9 * 6 ) / (3 + 9),

Как мне выполнить этот расчет с использованием структуры агрегации?

1 ответ

Решение

Для этого необходимо сначала рассчитать числитель (взвешенная сумма) и знаменатель (сумма весов) полученного отношения. После этого вам нужно только разделить одно на другое:

db.collection.aggregate({
  $group : {
     _id : 'weighted average', // build any group key ypo need
     numerator: { $sum: { $multiply: [ "$price", "$quantity" ] } },
     denominator: { $sum: "$quantity" }
  }
}, {
  $project: {
    average: { $divide: [ "$numerator", "$denominator" ] }
  }
})

Для получения дополнительной информации см. Документацию Агрегационного конвейера.

Другие вопросы по тегам