2012-08-14 72 views
1

我將下面的sql查詢翻譯成mongodb的map reduce查詢。MongoDB中如何寫入sql子句?

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) { 
         emit(this.o_orderpriority, 1); 
        } 
       } 

     }, 
    reduce: function(key, values) { 
       var count = 0; 
       for (var i = 0; i < values.length; i++) { 
        count += values[i]; 
       } 
       return count; 
      }, 
    out: 'query004' 
}); 

外觀,o_linetem在訂單採集的嵌入式陣列。

那麼結果是:

在SQL:

1-URGENT   10594 
2-HIGH   10476 
3-MEDIUM   10410 
4-NOT SPECIFIED 10556 
5-LOW   10487 

在對方MongoDB的結果:

{ "_id" : "1-URGENT", "value" : 29215 } 
{ "_id" : "2-HIGH", "value" : 29020 } 
{ "_id" : "3-MEDIUM", "value" : 28616 } 
{ "_id" : "4-NOT SPECIFIED", "value" : 29253 } 
{ "_id" : "5-LOW", "value" : 28765 } 

發生什麼事?我在地圖縮減中做了什麼錯誤?

+0

$退出?我不完全確定你的SQL在做什麼,但我會試着弄明白。 – ranman 2012-08-14 19:54:43

回答

1

您是否有不符合預期的提交日期順序多了LineItem多次發射每個orderpriority。

你不這樣做,在你的SQL語句 - 存在子句僅檢查存在不符合提交日期至少一個行項目。

如果你想要做的地圖當量/減少,那麼你應該添加一個return;聲明你成功發出每個訂單文檔之後。

+0

你也可以通過添加簡化了整個事情的存在等同於您的查詢開始與在這種情況下,你的地圖只是一個單一的線放出(this.o_orderpriority,1); – 2012-08-14 20:32:18

+0

的確我多次發出相同的命令。再次感謝你@ asya-kamsky – ulima69 2012-08-14 21:04:59