1

次のドキュメントの場合

{
    "_id" : ObjectId("511b7d1b3daee1b1446ecdfe"),
    "l_linenumber" : 1,
    "l_quantity" : 17,
    "l_extendedprice" : 21168.23,
    "l_discount" : 0.04,
    "l_tax" : 0.02,
    "l_returnflag" : "N",
    "l_linestatus" : "O",
    "l_shipdate" : ISODate("1996-03-13T03:00:00Z"),
    "l_commitdate" : ISODate("1996-02-12T03:00:00Z"),
    "l_receiptdate" : ISODate("1996-03-22T03:00:00Z"),
    "l_shipinstruct" : "DELIVER IN PERSON",
    "l_shipmode" : "TRUCK",
    "l_comment" : "blithely regular ideas caj",
}

私は2つの同様のmap reduce関数を試しました:

db.runCommand({
    mapreduce: "lineitem",
    query: {
        l_shipdate: {'$gte': new Date("Jan 01, 1994")},
        l_shipdate: {'$lt': new Date("Jan 01, 1995")},
        l_discount: {'$gte':0.05},
        l_discount: {'$lte':0.07},
        l_quantity: {'$lt':24}
    },
    map : function Map() {
            var revenue = this.l_extendedprice * this.l_discount;
            emit("REVENUE", revenue);
        },
    reduce : function(key, values) {
                return Array.sum(values);
            },
    out: 'query006'
});

2番

db.runCommand({
    mapreduce: "lineitem",
    map : function Map() {
            var dataInicial = new Date("Jan 1, 1994");
            var dataFinal = new Date("Jan 1, 1995");

            if( this.l_discount>=0.05 && this.l_discount<=0.07 && this.l_quantity<24 && this.l_shipdate>=dataInicial && this.l_shipdate<dataFinal) {
                var produto = this.l_extendedprice * this.l_discount;
                emit("revenue", produto);
            }
        },
    reduce : function(key, values) {
                return Array.sum(values);
            },
    out: 'query006'

});

私にとって、両方の関数は同等であり、おそらく同じ結果を返します。しかし、正しい答えを返すのは 2 番目だけです。

これらの関数は、TPC-H ベンチマークでの SQL クエリの存在を変換する私の試みです。クエリを次に示します。

select
    sum(l_extendedprice*l_discount) as revenue
from 
    lineitem
where 
    l_shipdate >= date '1994-01-01'
    and l_shipdate < date '1994-01-01' + interval '1' year
    and l_discount between 0.06 - 0.01 and 0.06 + 0.01
    and l_quantity < 24;

最初の関数でクエリ ステートメントを使用すると、結果が正解よりも大きくなるのはなぜですか? 機能は本当に同じですか?

4

1 に答える 1

0

あなたのクエリは$と演算子のドキュメントの次の段落に違反していると思います:

MongoDBは、コンマで区切られた式のリストを指定するときに、暗黙のAND演算を提供します。たとえば、上記のクエリを次のように記述できます。

db.inventory.find( { price: 1.99, qty: { $lt: 20 } , sale: true } )

ただし、クエリで、などの同じフィールドでAND演算が必要な場合は、2つの別々の式に演算子を{ price: { $ne: 1.99 } } AND { price: { $exists: true } }使用するか$and、フィールドの演算子式を組み合わせます{ price: { $ne: 1.99, $exists: true } }

ドキュメントのアドバイスに従うと、次のクエリでうまくいくはずです。

query: {
    l_shipdate: {'$gte': new Date("Jan 01, 1994"), '$lt': new Date("Jan 01, 1995")},
    l_discount: {'$gte':0.05, '$lte':0.07},
    l_quantity: {'$lt':24}
},
于 2013-02-16T19:33:37.637 に答える