Агрегация MongoDB заменяет многократное вычисление - PullRequest
2 голосов
/ 03 мая 2020

Я пытаюсь получить avgBMI, maxBMI и maxBMI из моей коллекции.

var bmi =  db.people.aggregate(
    [   
        {
            $group:
            {
                _id: 1,
                avgBmi: {$avg: {$divide: [{$toDouble:"$weight"},{$pow: [{$divide:[{$toDouble:"$height"},100]},2]}]}},
                minBmi: {$min: {$divide: [{$toDouble:"$weight"},{$pow: [{$divide:[{$toDouble:"$height"},100]},2]}]}},
                maxBmi: {$max: {$divide: [{$toDouble:"$weight"},{$pow: [{$divide:[{$toDouble:"$height"},100]},2]}]}}
            }
        }
    ]
);

это работает, но противно ...

https://mongoplayground.net/p/LxJU8KmRzq2

Как заменить процедуру для расчета, чтобы прекратить делать это 3 раза?

1 Ответ

2 голосов
/ 04 мая 2020

Используйте этап $project, чтобы назначить операцию одному полю, а затем используйте это поле внутри этапа $group.

db.people.aggregate([
  { "$project": {
    "cal": {
      "$divide": [
        { "$toDouble": "$weight" },
        { "$pow": [{ "$divide": [{ "$toDouble": "$height" }, 100] }, 2] }
      ]
    }
  }},
  { "$group": {
    "_id": 1,
    "avgBmi": { "$avg": "$cal" },
    "minBmi": { "$min": "$cal" },
    "maxBmi": { "$max": "$cal" }
  }}
])

https://mongoplayground.net/p/KKCrxBZA_kO

...