1

以下の sql クエリを mongodb の 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;

そして、次の map reduce クエリ:

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 が orders コレクションに埋め込まれた配列であることを確認してください。

結果は次のとおりです。

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 }

何が起きましたか?マップ削減で何が間違っていましたか?

4

1 に答える 1

1

予定されたコミット日に間に合わなかった注文に複数の項目がある場合、各 orderpriority を複数回発行しています。

SQL ステートメントでそれを行っていません。exists 句は、コミット日を満たしていない項目が少なくとも 1 つあることを確認するだけです。

map/reduce で同等のことを行いたい場合は、return;注文ドキュメントごとに正常に発行した後にステートメントを追加する必要があります。

于 2012-08-14T20:30:52.930 に答える