문서 메뉴

문서 홈애플리케이션 개발MongoDB 매뉴얼

축소 기능 문제 해결

이 페이지의 내용

  • 출력 유형 확인
  • 매핑된 값의 순서에 영향을 주지 않도록 합니다.
  • 함수 멱등성 감소 보장

참고

맵 리듀스의 대안으로서의 집계 파이프라인

MongoDB 5.0부터 맵 리듀스는 더 이상 사용되지 않습니다.

맵 리듀스 대안으로서의 애그리게이션 파이프라인 예시는 다음을 참조하세요.

또한 집계 파이프라인 은 맵 리듀스 작업보다 문제를 해결하기 쉽습니다.

reduce 함수는 맵 리듀스 작업 중에 특정 키와 연결된 모든 값을 단일 객체로 '줄이는' 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. myTestValuesreduceFunction1 을(를) 호출합니다.

    reduceFunction1('myKey', myTestValues);
  4. reduceFunction1 가 정수를 반환했는지 확인합니다.

    20
  5. keySKUvaluesCountObjects 인수를 사용하는 reduceFunction2 함수를 정의합니다. valuesCountObjects 은(는) 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. myTestObjectsreduceFunction2 을(를) 호출합니다.

    reduceFunction2('myKey', myTestObjects);
  8. reduceFunction2 가 정확히 countqty 필드가 있는 문서를 반환했는지 확인합니다.

    { "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 은(는) 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 }

맵 리듀스 작업은 동일한 키에 대해 reduce 를 여러 번 호출할 수 있고 작업 세트에 있는 키의 단일 인스턴스에 대해 reduce 을 호출하지 않으므로 reduce 함수는 다음 값을 반환해야 합니다. map 함수에서 방출된 값과 동일한 유형입니다. reduce 함수가 최종 값에 영향을 주지 않고 '축소된' 값을 처리하는지 테스트할 수 있습니다.

  1. keySKUvaluesCountObjects 인수를 사용하는 reduceFunction2 함수를 정의합니다. valuesCountObjects 은(는) 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 }
← 지도 기능 문제 해결