2010-06-08 3 views
7

MongoDB에 MapReduce를 작성했으며 전역 변수를 쓰기/읽기 캐시로 사용하고 싶습니다. 나는지도 기능 인스턴스에서 전역 변수를 가질 수없는 알 - 난 그냥 각 기능의 인스턴스 내에서 전역 변수 를 원한다. 이러한 유형의 기능은 Hadoop의 MapReduce에 존재하므로 MongoDB에있을 것으로 기대하고있었습니다. 그러나 다음은 작동하지 않습니다MongoDB MapReduce :지도 함수 인스턴스 내의 전역 변수?

var cache = {}; // Does not seem to work! 
function() { 
    var hashValue = this.varValue1 + this.varValue2; 
    if(typeof(cache[hashValue])!= 'undefined') { 
    // Do nothing, we've processed at least one input record with this hash 
    } else { 
    // Process the input record 
    // Cache the record 
    cache[hashValue] = '1'; 
    } 
} 

이 MongoDB를의 맵리 듀스 구현에 사용할 수 없습니다, 또는 나는 (JS에서 경험하지) 자바 스크립트에서 뭔가 잘못하고있는 중이 야? docs 보면

+0

OK, 나는 다시 통해 이성을 상실했고 여기 혼란의 지점이있다. 이 기능이지도입니까, 아니면 축소입니까? 당신이 "임시"캐시를 원하는 경우 , 당신은 단순히하거나지도에서 감소하는 임시 몽고의 수집 및 참조를 만들 수 있습니다. 그러나,() 당신이 바로 감소 단계에서이 문제를 해결할 수없는 경우라고하기 어렵다 기능지도()와 감소 모두를 모른 채. –

+0

이것은지도 기능입니다. reduce 함수에서이 작업을 수행 할 수 있지만 그 시점에서 수행해야 할 다른 작업이 있습니다. 즉, 일부 값을 집계합니다. MongoDB에서 캐시 역할을 할 컬렉션을 만들 수도 있습니다. 사실 내가 처음에 그랬습니다. 그러나 이것은 이상적인 솔루션은 아닙니다 (여러지도 기능 인스턴스가있는 경우 문제가 느려지는 경우).이 기능은 Hadoop의 MapReduce에 이미있는 기능이므로 기대할 수도 있습니다. Nickpicker라고 불러도되지만 MongoDB에서 수정해야 할 필요가 있다고 생각합니다. –

답변

5

, 나는 다음과 같은 찾는거야 :

db.runCommand(
{ mapreduce : <collection>, 
    map : <mapfunction>, 
    reduce : <reducefunction> 
    [, scope : <object where fields go into javascript global scope >] 
} 
); 

내가 "범위"변수는 당신이 필요하다고 생각합니다.

은 "범위"변수를 사용하여 테스트/예 on Github있다.

나는이 물건에 여전히 새로운 해요,하지만 잘하면 그건 당신이 시작하는 데 충분하다.

+0

감사합니다. 그러나 범위는 전역 읽기/쓰기가 아니며 읽기만 가능합니다. 그건 그렇고,이 예제는 스코프가 map/reduce 함수에 전달하는 변수 xx를 사용하지 않는 것처럼 보입니다. –

+1

* in * 범위의 변수는 완벽하게 쓸 수 있습니다. –

+0

github 링크가 죽었습니다. – zella

1

게이츠 VP가 말한 것처럼 글로벌 범위에 캐시를 추가해야합니다. 그래서, 완전한 답변을 제공하는 스크립트를 고려하는, 이것은 당신이해야합니다 것입니다 :

db.runCommand(
{ mapreduce : <your collection>, 
    map : <your map function, or reference to it>, 
    reduce : <your reduce function, or reference to it>, 
    scope : { cache : {} } 
} 
); 

명령은 글로벌 컨텍스트에 '범위'개체 매개 변수의 내용을 주입합니다. 그런 다음 캐싱은 맵 기능에서 사용하는 방법에 따라 작동합니다. 나는 이것을 시험했다.