MongoDB map减少函数语法

时间:2012-08-11 23:48:42

标签: mongodb mapreduce

我正在尝试将此sql查询转换为map reduce

select
    o_orderpriority, 
    count(*) as order_count
from 
    orders
where 
    o_orderdate >= date '1993-07-01'
    and o_orderdate < date '1993-07-01' + interval '3' month
    and exists (
        select 
        *
        from 
        lineitem
        where 
        l_orderkey = o_orderkey
        and l_commitdate < l_receiptdate
    )
group by 
    o_orderpriority
order by 
    o_orderpriority;

我尝试了以下地图缩小功能

    db.runCommand({
    mapreduce: "orders",
    query: {
        o_orderdate: {'$gte': new Date("July 01, 1993")},
        o_orderdate: {'$lt': new Date("Oct 01, 1993")}
    },
    map: function Map() {
            for(var i in this.o_lineitem) {
                if( this.o_lineitem[i].l_commitdate < this.o_lineitem[i].l_receiptdate) {
                    var o_orderpriority = this.o_lineitem[i].o_orderpriority;
                    emit( o_orderpriority, {count: 1} );
                }
            }
        },
    reduce: function(key, values) {
                var count= 0;
                for (var i = 0; i < values.length; i++) {
                    count+= values[i];
                }
                return count;
            },
    out: 'query004'
});

当我跑步时,我得到了跟随警报

星期六8月11日20:44:32 SyntaxError:missing)在条件(shell)之后:9

对我来说,没有)失踪,是吗?

我做了@Stenie指出的更正,但现在我有以下问题

{
        "assertion" : "value too large to reduce",
        "assertionCode" : 13070,
        "errmsg" : "db assertion failure",
        "ok" : 0
}

1 个答案:

答案 0 :(得分:3)

问题是你的发射和你的reduce函数不会返回相同的东西。

您的地图功能会发出以下值:

{count: 1}

这意味着您的reduce必须返回相同的格式。

您在reduce中返回一个简单的值:

return count;

您可以将您的发射更改为仅发出1而不是JSON文档,然后您不必更改缩小,否则更改缩小以返回JSON文档{count:X},其中X是计算的数量。< / p>

仅供参考,导致错误“值太大而无法减少”的原因是,一旦你混合了这样的类型,'+'运算符就会开始连接你的值而不是添加它们,最终它会变得太大。要了解如何调试此操作,我建议使用Troubleshooting MapReduce页面