Docs Menu
Docs Home
/ / /
몽고이드
/

맵/리듀스

이 페이지의 내용

  • 실행
  • 원시 결과
  • 통계

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 메서드 또는 해당 별칭 rawresults 를 통해 검색할 수 있습니다.

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: 개별 카운트 메서드. emittedreduced 메서드 이름은 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 메서드를 사용하여 원본 결과를 조회 하고 원본 결과에서 통계를 얻는 것이 좋습니다.

돌아가기

집계 파이프라인

이 페이지의 내용