У меня есть базы данных, где у меня есть:
{
"_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)
Можете ли вы мне помочь? Заранее спасибо.