Переписать агрегацию для отображения метода сокращения в монго - PullRequest
0 голосов
/ 25 марта 2020

У меня есть базы данных, где у меня есть:

{
    "_id" : ObjectId("5e750506cb670d8afe8c94da"),
    "height" : "166.27",
    "weight" : "68.62",
    "nationality" : "Afghanistan"
    (more fields)
},
{
    "_id" : ObjectId("5e750506cb670d8afe8c99d5"),
    "height" : "162.44",
    "weight" : "71.8",
    "nationality" : "Afghanistan"
(more fields)
}
...

Сначала я создал агрегацию:

db.getCollection('people').aggregate([{
$project:
    {
        "nationality": "$nationality",
        "weight": "$weight",
        "height": "$height",
        "bmi": {$divide: [{"$toDouble": "$weight"}, {$pow: [{$divide: [{"$toDouble": "$height"}, 100]},2]}]}
    }
},
{
    $group:
    {
        _id: "$nationality",
        "weight": {$sum:{"$toDouble": "$weight"}},
        "height": {$sum:{"$toDouble": "$height"}},
        "avgbmi": {$avg: "$bmi"},
        "sumbmi": {$sum: "$bmi"},
        "minbmi": {$min: "$bmi"},
        "maxbmi": {$max: "$bmi"}
    }
}, {
    $sort: {_id: 1}
}])

, и результат был:

{
    "_id" : "Afghanistan",
    "weight" : 2729.14,
    "height" : 6587.53,
    "avgbmi" : 24.8445707030224,
    "sumbmi" : 968.938257417875,
    "minbmi" : 17.0990239681871,
    "maxbmi" : 31.6807242778146
}
...

В настоящее время я пытаюсь переписать его на карту-уменьшить. Но здесь у меня проблема с findind мин и макс. Пока у меня есть:

var mapFunction2 = function() {
                           var key = this.nationality
                           var value = {
                                         count: 1,
                                         weight: this.weight,
                                         height: this.height,
                                         sumbmi: parseFloat(this.weight)/(parseFloat(this.height)/100 * parseFloat(this.height)/100)
                                       };
                           emit(key, value);
                    };

var reduceFunction2 = function(key, values) {
    reducedVal = { count: 0, weight: 0 , height: 0, sumbmi: 0, minbmi: 0, maxbmi: 0};
    for (var idx = 0; idx < values.length; idx++) {
            reducedVal.count += values[idx].count;
            var weight = parseFloat(values[idx].weight);
            var height = parseFloat(values[idx].height);
            reducedVal.weight += weight;
            reducedVal.height += height;
            reducedVal.sumbmi += values[idx].sumbmi;
    }
    return reducedVal;
};

var finalizeFunction2 = function (key, reducedVal) {
    reducedVal.avgbmi = parseFloat(reducedVal.sumbmi)/reducedVal.count;
    return reducedVal;
};

db.getCollection('people').mapReduce( mapFunction2, reduceFunction2,  {finalize:finalizeFunction2, out:{inline:1}}).results

У меня проблема здесь, потому что мои мин и макс странные ...? (мин. было около 20, но макс было 940, а массив в уменьшении имеет длину == 3)

Можете ли вы мне помочь? Заранее спасибо.

...