在mongodb中查找多维最大值

问题描述 投票:2回答:2

如果我有这个收藏夹

{ "humidity" : 96.5812, "temperature" : 10.5006 }
{ "humidity" : 97.1184, "temperature" : 10.2808 }
{ "humidity" : 96.2882, "temperature" : 8.4493 }
{ "humidity" : 97.8266, "temperature" : 7.4481 }
{ "humidity" : 98.9255, "temperature" : 7.2772 }
{ "humidity" : 99.4628, "temperature" : 7.3993 }
{ "humidity" : 99.4383, "temperature" : 7.4237 }
{ "humidity" : 99.6825, "temperature" : 7.1307 }
{ "humidity" : 99.5116, "temperature" : 6.1539 }
{ "humidity" : 99.8779, "temperature" : 5.4701 }

如何通过mapreduce获得温度的最大值和最小值?

mongodb mapreduce
2个回答
7
投票
// Simple map function - just returns the temperature value
// for the record
var map = function() {
    emit('temperature', this.temperature);
};

// A reduce function to find the minimum value in the reduced set
var reduce_min = function(key, values) {
    var min = values[0];
    values.forEach(function(val) {
        if (val < min) min = val;
    })
    return min;
};

// A reduce function to find the maximum value in the reduced set
var reduce_max = function(key, values) {
    var max = values[0];
    values.forEach(function(val){
        if (val > max) max = val;
    })
    return max;
}

// Use the mapReduce function to get the min and max
var min = db.temp.mapReduce(map, reduce_min, {out:{inline:1}}).results[0].value;
var max = db.temp.mapReduce(map, reduce_max, {out:{inline:1}}).results[0].value;
print("Min: " + min + ", max: " + max);

0
投票

我喜欢上面的答案,但是这里做了一些小的修改以清理您的代码。这将为您提供相同的输出,但是代码很少。您可以在线搜索Math.min()和Math.max()文档。基本上,有JavaScript函数可以找到最小值和最大值。和“ ...”用于告诉Math.min()/ max()值是一个数组]

var map = function() {
    emit('temperature', this.temperature);
};

// A reduce function to find the minimum value in the reduced set
var reduce_min = function(key, values) {
    return Math.min(...values);
};

// A reduce function to find the maximum value in the reduced set
var reduce_max = function(key, values) {
    return Math.max(...values);
}

// Use the mapReduce function to get the min and max
var min = db.temp.mapReduce(map, reduce_min, {out:{inline:1}}).results[0].value;
var max = db.temp.mapReduce(map, reduce_max, {out:{inline:1}}).results[0].value;
print("Min: " + min + ", max: " + max);
© www.soinside.com 2019 - 2024. All rights reserved.