2012-08-14 81 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