Docs Menu
Docs Home
/
MongoDBマニュアル
/ /

reduce 関数のトラブルシューティング

項目一覧

  • 出力タイプの確認
  • マップされた値の順序を区別しないようにする
  • 関数の冪等性を確実に減らす

注意

map-reduce の代替としての集計パイプライン

MongoDB 5.0以降、 map-reduceは非推奨です。

map-reduce を集計パイプラインに置き換える例については、以下を参照してください。

また、map-reduce 操作よりも集計パイプラインの方がトラブルシューティングが簡単です。

reduce関数は、 map-reduce操作中に特定のキーに関連付けられたすべての値を 1 つのオブジェクトに削減する JavaScript 関数です。 reduce関数はさまざまな要件を満たしている必要があります。 このチュートリアルは、 reduce関数が次の条件を満たしていることを確認するのに役立ちます。

  • reduce関数は、 map関数によって出力されるvalue同一である必要があるオブジェクトを返す必要があります。

  • valuesArray内の要素の順序は、 reduce関数の出力には影響しません。

  • reduce関数は冪等である必要があります。

reduce関数のすべての要件のリストについては、 mapReduceまたは mongoshヘルパー メソッドdb.collection.mapReduce()を参照してください。

reduce関数がmap関数から出力する値と同じ型の値を返すことをテストできます。

  1. keyCustIdvaluesPrices引数を持つreduceFunction1関数を定義します。 valuesPricesは整数の配列です。

    var reduceFunction1 = function(keyCustId, valuesPrices) {
    return Array.sum(valuesPrices);
    };
  2. 整数のサンプル配列を定義します。

    var myTestValues = [ 5, 5, 10 ];
  3. を使用してreduceFunction1 myTestValuesを呼び出します。

    reduceFunction1('myKey', myTestValues);
  4. reduceFunction1が整数を返したことを確認します。

    20
  5. keySKUvaluesCountObjects引数を持つreduceFunction2関数を定義します。 valuesCountObjectsは、2 つのフィールドcountqtyを含むドキュメントの配列です。

    var reduceFunction2 = function(keySKU, valuesCountObjects) {
    reducedValue = { count: 0, qty: 0 };
    for (var idx = 0; idx < valuesCountObjects.length; idx++) {
    reducedValue.count += valuesCountObjects[idx].count;
    reducedValue.qty += valuesCountObjects[idx].qty;
    }
    return reducedValue;
    };
  6. ドキュメントのサンプル配列を定義します。

    var myTestObjects = [
    { count: 1, qty: 5 },
    { count: 2, qty: 10 },
    { count: 3, qty: 15 }
    ];
  7. を使用してreduceFunction2 myTestObjectsを呼び出します。

    reduceFunction2('myKey', myTestObjects);
  8. reduceFunction2count フィールドと フィールドのみを含むドキュメントを返したことを確認します。qty

    { "count" : 6, "qty" : 30 }

reduce関数は、引数としてkeyvalues配列を受け取ります。 reduce関数の結果がvalues配列内の要素の順序に依存しないことをテストできます。

  1. 配列要素の順序のみが異なるサンプルvalues1配列とサンプルvalues2配列を定義します。

    var values1 = [
    { count: 1, qty: 5 },
    { count: 2, qty: 10 },
    { count: 3, qty: 15 }
    ];
    var values2 = [
    { count: 3, qty: 15 },
    { count: 1, qty: 5 },
    { count: 2, qty: 10 }
    ];
  2. keySKUvaluesCountObjects引数を持つreduceFunction2関数を定義します。 valuesCountObjectsは、2 つのフィールドcountqtyを含むドキュメントの配列です。

    var reduceFunction2 = function(keySKU, valuesCountObjects) {
    reducedValue = { count: 0, qty: 0 };
    for (var idx = 0; idx < valuesCountObjects.length; idx++) {
    reducedValue.count += valuesCountObjects[idx].count;
    reducedValue.qty += valuesCountObjects[idx].qty;
    }
    return reducedValue;
    };
  3. 最初にvalues1を使用してreduceFunction2を呼び出し、次にvalues2を使用して を呼び出します。

    reduceFunction2('myKey', values1);
    reduceFunction2('myKey', values2);
  4. reduceFunction2が同じ結果を返したことを確認します。

    { "count" : 6, "qty" : 30 }

map-reduce 操作では、同じキーに対してreduceが複数回呼び出される可能性があり、ワーキングセット内のキーの単一のインスタンスに対してreduceが呼び出されないため、 reduce関数は次の値を返す必要があります: map関数から出力される値と同じ型。 reduce関数が最終値に影響を与えずに「削減された」値を処理することをテストできます。

  1. keySKUvaluesCountObjects引数を持つreduceFunction2関数を定義します。 valuesCountObjectsは、2 つのフィールドcountqtyを含むドキュメントの配列です。

    var reduceFunction2 = function(keySKU, valuesCountObjects) {
    reducedValue = { count: 0, qty: 0 };
    for (var idx = 0; idx < valuesCountObjects.length; idx++) {
    reducedValue.count += valuesCountObjects[idx].count;
    reducedValue.qty += valuesCountObjects[idx].qty;
    }
    return reducedValue;
    };
  2. サンプルキーを定義します。

    var myKey = 'myKey';
  3. reduceFunction2関数の呼び出しである要素を含むサンプルvaluesIdempotent配列を定義します。

    var valuesIdempotent = [
    { count: 1, qty: 5 },
    { count: 2, qty: 10 },
    reduceFunction2(myKey, [ { count:3, qty: 15 } ] )
    ];
  4. reduceFunction2に渡される値を組み合わせたサンプルvalues1配列を定義します。

    var values1 = [
    { count: 1, qty: 5 },
    { count: 2, qty: 10 },
    { count: 3, qty: 15 }
    ];
  5. 最初にmyKeyvaluesIdempotentを使用してreduceFunction2を呼び出し、次にmyKeyvalues1を使用して を呼び出します。

    reduceFunction2(myKey, valuesIdempotent);
    reduceFunction2(myKey, values1);
  6. reduceFunction2が同じ結果を返したことを確認します。

    { "count" : 6, "qty" : 30 }

戻る

トラブルシューティング マップ