축소 기능 문제 해결
참고
맵 리듀스의 대안으로서의 집계 파이프라인
MongoDB 5.0 부터 맵 리듀스 는 더 이상 사용되지 않습니다.
맵 리듀스 대신 집계 파이프라인을 사용해야 합니다. 집계 파이프라인은 맵 리듀스보다 성능과 유용성 측면에서 더 우수합니다.
4}
$group
$merge
, 등과 같은 집계 파이프라인 단계를 사용하여 맵 축소 연산을 다시 작성할 수 있습니다.사용자 지정 기능이 필요한 맵 리듀스 작업의 경우
$accumulator
및$function
집계 연산자를 사용할 수 있습니다. 이러한 연산자를 사용하여 JavaScript에서 사용자 지정 집계 표현식을 정의할 수 있습니다.
맵 리듀스 대안으로서의 집계 파이프라인 예시는 다음을 참조하세요.
또한 집계 파이프라인 은 맵 리듀스 작업보다 문제를 해결하기 쉽습니다.
reduce
함수는 맵 리듀스 작업 중에 특정 키와 연결된 모든 값을 단일 객체 로 '줄이는' JavaScript 함수입니다. reduce
함수는 다양한 요구 사항을 충족해야 합니다. 이 튜토리얼은 reduce
함수가 다음 기준을 충족하는지 확인하는 데 도움이 됩니다.
reduce
함수는map
함수에서 방출한value
의 유형과 유형 이 동일 해야 하는 객체를 반환해야 합니다.valuesArray
의 요소 순서는reduce
함수의 출력에 영향을 주지 않아야 합니다.reduce
함수는 멱등성이 있어야 합니다.
reduce
함수에 대한 모든 요구 사항 목록은 mapReduce
또는 mongosh
헬퍼 메서드 db.collection.mapReduce()
를 참조하세요.
출력 유형 확인
reduce
함수가 map
함수에서 방출된 값과 동일한 유형의 값을 반환하는지 테스트할 수 있습니다.
keyCustId
및valuesPrices
인수를 사용하는reduceFunction1
함수를 정의합니다.valuesPrices
은(는) 정수 배열입니다:var reduceFunction1 = function(keyCustId, valuesPrices) { return Array.sum(valuesPrices); }; 정수의 샘플 배열을 정의합니다:
var myTestValues = [ 5, 5, 10 ]; myTestValues
로reduceFunction1
을(를) 호출합니다.reduceFunction1('myKey', myTestValues); reduceFunction1
가 정수를 반환했는지 확인합니다.20 keySKU
및valuesCountObjects
인수를 사용하는reduceFunction2
함수를 정의합니다.valuesCountObjects
은(는)count
및qty
두 필드를 포함하는 문서 배열입니다.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; }; 샘플 문서 배열을 정의합니다.
var myTestObjects = [ { count: 1, qty: 5 }, { count: 2, qty: 10 }, { count: 3, qty: 15 } ]; myTestObjects
로reduceFunction2
을(를) 호출합니다.reduceFunction2('myKey', myTestObjects); reduceFunction2
가 정확히count
및qty
필드가 있는 문서를 반환했는지 확인합니다.{ "count" : 6, "qty" : 30 }
매핑된 값의 순서에 영향을 주지 않도록 합니다.
reduce
함수는 key
및 values
배열을 인수로 사용합니다. reduce
함수의 결과가 values
배열의 요소 순서에 의존하지 않는지 테스트할 수 있습니다.
배열 요소의 순서만 다른 샘플
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 } ]; keySKU
및valuesCountObjects
인수를 사용하는reduceFunction2
함수를 정의합니다.valuesCountObjects
은(는)count
및qty
두 필드를 포함하는 문서 배열입니다.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; }; 먼저
values1
을(를) 사용하여reduceFunction2
을(를) 호출한 다음values2
을(를) 사용합니다.reduceFunction2('myKey', values1); reduceFunction2('myKey', values2); reduceFunction2
가 동일한 결과를 반환했는지 확인합니다.{ "count" : 6, "qty" : 30 }
함수 멱등성 감소 보장
맵 리듀스 작업은 동일한 키에 대해 reduce
를 여러 번 호출할 수 있고 작업 세트에 있는 키의 단일 인스턴스에 대해 reduce
을 호출하지 않으므로 reduce
함수는 다음 값을 반환해야 합니다. map
함수에서 방출된 값과 동일한 유형입니다. reduce
함수가 최종 값에 영향을 주지 않고 '축소된' 값을 처리하는지 테스트할 수 있습니다.
keySKU
및valuesCountObjects
인수를 사용하는reduceFunction2
함수를 정의합니다.valuesCountObjects
은(는)count
및qty
두 필드를 포함하는 문서 배열입니다.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; }; 샘플 키를 정의합니다.
var myKey = 'myKey'; reduceFunction2
함수를 호출하는 요소가 포함된 샘플valuesIdempotent
배열을 정의합니다.var valuesIdempotent = [ { count: 1, qty: 5 }, { count: 2, qty: 10 }, reduceFunction2(myKey, [ { count:3, qty: 15 } ] ) ]; reduceFunction2
에 전달된 값을 결합하는 샘플values1
배열을 정의합니다.var values1 = [ { count: 1, qty: 5 }, { count: 2, qty: 10 }, { count: 3, qty: 15 } ]; 먼저
myKey
및valuesIdempotent
를 사용하여reduceFunction2
을 호출한 다음myKey
및values1
을(를) 호출합니다.reduceFunction2(myKey, valuesIdempotent); reduceFunction2(myKey, values1); reduceFunction2
가 동일한 결과를 반환했는지 확인합니다.{ "count" : 6, "qty" : 30 }