2012-08-11 46 views
2

那麼我嘗試翻譯這個SQL查詢來映射減少MongoDB的地圖減少函數的語法

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' 
}); 

艾當運行我得到遵循警報

星期六年08月11二十時44分32秒的SyntaxError:錯過)後條件(殼):9

對我來說,沒有)失蹤,是嗎?

我沒有通過@Stenie指出改正,但現在我有如下問題

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

您遺漏了「」第9行:if(this.o_lineitem [i] .l_commitdate 2012-08-12 05:58:20

+0

@AsyaKamsky前的最後]我把點,但問題仍然存在: 太陽08月12日9時03分31秒語法錯誤:10 – ulima69 2012-08-12 12:05:58

+1

@ ulima69:後參數列表(殼)失蹤)10號線已經發出'(本.o_lineitem [I] .o_orderpriority,count_order:1);'但應該是'發射(this.o_lineitem [I] .o_orderpriority,count_order);'。 – Stennie 2012-08-12 13:13:45

回答

3

的問題是你的EMIT和你減少功能不回同樣的事情。

你的地圖功能發出值:

{count: 1} 

這意味着您減少必須返回相同的格式。

您正在重返您減少一個簡單的值:

return count; 

你可以改變你的射向只是發出1,而不是JSON文件,然後你不必改變你的減少,否則更改減少返回一個JSON文檔{count:X},其中X是計算的計數。僅供參考,如果您將這些類型混合,「+」運算符會開始連接您的值而不是添加它們,最終會變得太大。看你怎麼可以調試此我建議Troubleshooting MapReduce頁面