맵/리듀스
Mongoid는 사용자 지정 맵/리듀스 작업 또는 간단한 애그리게이션을 수행하기 위해 MongoDB의 맵/리듀스 프레임워크를 중심으로 DSL을 제공합니다.
참고
맵 리듀스 작업은 더 이상 사용되지 않습니다. 집계 프레임워크 는 맵 리듀스 작업보다 더 나은 성능과 유용성을 제공하므로 신규 개발에 선호되어야 합니다.
실행
map_reduce
를 호출하고 맵 및 리듀스 JavaScript 함수를 제공하여 맵/리듀스를 수행하기 위한 클래스 또는 기준을 Mongoid에 알릴 수 있습니다.
map = %Q{ function() { emit(this.name, { likes: this.likes }); } } reduce = %Q{ function(key, values) { var result = { likes: 0 }; values.forEach(function(value) { result.likes += value.likes; }); return result; } } Band.where(:likes.gt => 100).map_reduce(map, reduce).out(inline: 1)
기준과 마찬가지로 맵/리듀스 호출은 느리게 평가됩니다. 따라서 결과를 반복하거나 데이터베이스 히트를 강제해야 하는 래퍼를 호출할 때까지 아무 것도 데이터베이스 에 충돌하지 않습니다.
Band.map_reduce(map, reduce).out(replace: "mr-results").each do |document| p document # { "_id" => "Tool", "value" => { "likes" => 200 }} end
맵/리듀스와 함께 제공해야 하는 유일한 사항은 결과를 출력할 위치입니다. 이를 제공하지 않으면 오류가 발생합니다. #out
에 유효한 옵션은 다음과 같습니다.
inline: 1
: 출력을 컬렉션 에 저장 하지 않습니다.replace: "name"
: 제공된 이름으로 컬렉션에 저장하고 해당 컬렉션에 존재하는 모든 문서를 덮어씁니다.merge: "name"
: 제공된 이름으로 컬렉션 에 저장하고 결과를 기존 문서와 병합합니다.reduce: "name"
: 제공된 이름으로 컬렉션에 저장하고 해당 컬렉션의 기존 결과를 모두 줄입니다.
원시 결과
맵/리듀스 실행 결과는 execute
메서드 또는 해당 별칭 raw
및 results
를 통해 검색할 수 있습니다.
mr = Band.where(:likes.gt => 100).map_reduce(map, reduce).out(inline: 1) mr.execute # => {"results"=>[{"_id"=>"Tool", "value"=>{"likes"=>200.0}}], "timeMillis"=>14, "counts"=>{"input"=>4, "emit"=>4, "reduce"=>1, "output"=>1}, "ok"=>1.0, "$clusterTime"=>{"clusterTime"=>#<BSON::Timestamp:0x00005633c2c2ad20 @seconds=1590105400, @increment=1>, "signature"=>{"hash"=><BSON::Binary:0x12240 type=generic data=0x0000000000000000...>, "keyId"=>0}}, "operationTime"=>#<BSON::Timestamp:0x00005633c2c2aaf0 @seconds=1590105400, @increment=1>}
통계
MongoDB 서버 4.2 이하에서는 맵/리듀스 실행 통계를 제공합니다. MongoDB 4.4 부터 맵/리듀스는 집계 파이프라인을 통해 구현되며 이 섹션에 설명된 통계는 사용할 수 없습니다.
MapReduce
객체에 제공되는 메서드는 다음과 같습니다.
counts
: 파이프라인을 통해 읽고, 내보내고, 줄이고, 출력한 문서 수입니다.input
,emitted
,reduced
,output
: 개별 카운트 메서드.emitted
및reduced
메서드 이름은counts
의 해시 키와 다르게 명명됩니다.time
: 맵/리듀스 파이프라인 이 실행되는 데 걸린 시간(단위: 밀리초)입니다.
다음 코드는 통계를 조회하는 방법을 보여줍니다.
mr = Band.where(:likes.gt => 100).map_reduce(map, reduce).out(inline: 1) mr.counts # => {"input"=>4, "emit"=>4, "reduce"=>1, "output"=>1} mr.input # => 4 mr.emitted # => 4 mr.reduced # => 1 mr.output # => 1 mr.time # => 14
참고
각 통계 메서드 호출은 맵/리듀스 파이프라인 을 다시 실행합니다. 실행 결과는 Mongoid에 저장되지 않습니다. 여러 통계가 필요한 경우 execute
메서드를 사용하여 원본 결과를 조회 하고 원본 결과에서 통계를 얻는 것이 좋습니다.