MongoDB MapReduce多次使用相同的密钥?

时间:2014-04-28 08:42:32

标签: mongodb mapreduce

首先:'是'或'否' - 与文档的链接就足以作为答案。

在mongo dbs mapreduce中,可以为同一个键多次调用reduce函数,还是保证每个键调用一次reduce函数?

假设我对map函数有以下输入:

{ id: 1, day: 1, category: 1, value: 5 }, 
{ id: 2, day: 1, category: 2, value: 5 }, 
{ id: 3, day: 2, category: 2, value: 7 },
{ id: 4, day: 2, category: 2, value: 7 }

以下关键字:

{ 'day': this.day, 'category': this.category }

为每个键发出以下值:

{ 'value': this.value }

2 个答案:

答案 0 :(得分:2)

是的,对于同一个密钥,可以多次调用reduce,除非只有一个结果,在这种情况下根本不调用reduce,因为没有什么可以减少:http://docs.mongodb.org/manual/tutorial/troubleshoot-reduce-function/#ensure-reduce-function-idempotence

答案 1 :(得分:1)

或者更准确地说是或否,mapReduce的一个实例:

db.collection.mapReduce(
    function() {
        emit(
            { "day": this.day, "category": this.category },
            this.value
        );
    },
    function(key, value) {
        var reduced = 0;
        values.forEach(function(value) {
            reduced += value;
        });
        return reduced;
    },
    {
        "out": { "inline": 1 }
    }
)

但是当然,在您提供的数据中,“key”在每种情况下都会有所不同,实际上并不会调用“reduce”函数。这里发生的是“映射器”中的值只是简单地发送到输出而不被触摸。

只有当同一个键实际存在“多个”值时才会实际调用“reduce”函数。这是mapReduce的重点。