2010-06-04 7 views
2

내가 본 모든 MongoDB MapReduce 예제는 숫자 계산/추가를 처리했습니다. 문자열을 결합해야하는데 MapReduce가 작업을위한 최상의 도구 인 것처럼 보입니다. 이 형식의 큰 MongoDB 컬렉션이 있습니다 :Mongodb MapReduce를 사용하여 문자열을 연결 하시겠습니까?

{name: userone, type: typeone} 
{name: usertwo, type: typetwo} 
{name: userthree, type: typeone} 

각 이름은 하나의 유형 만 있지만 이름은 반드시 고유하지는 않습니다. 나는 이러한 목표를 달성하기 위해 맵리 듀스를 사용하려고했다

{type: typeone, names: userone, usertwo} 
{type: typetwo, names: userthree} 

: 나는 쉼표 목록 또는 같은 배열을 분리 중 하나로, 특정 유형의 모든 이름을 나열하는 컬렉션 끝내고 싶다. 유형에 대해 한 명의 사용자 만있을 때 내 기능이 올바르게 작동합니다. 그러나 둘 이상의 사용자가있을 때 '정의되지 않음'이 이름 필드에 저장됩니다.

Javascript가 좋지 않아 MongoDB를 배우기 때문에 간단한 데이터 형식이나 범위 오류 일 수 있습니다.

여기 내 맵과 기능이 있습니다. 그들에게 무슨 문제가 있습니까?

map = function() { 
emit(this.user,{type:this.type}); 
} 

reduce = function(key, values) { 
var all=""; 
for(var i in values) { 
all+=values[i]['type']+","; 
} 
return all; 
} 

답변

5

유형별로 그룹화를 시도하는 것처럼 보입니다. 그렇다면 먼저 방출해야합니다. 거기에서 꽤 많이 코드와 같았지 만, 조금만 청소하는 자유를 가졌습니다.

축소 함수가 작은 그룹에서 여러 번 호출 될 수 있으므로주의해야합니다. 따라서 코드가 지정된 환경에서 코드를 사용한 경우 추가로 쉼표가 추가 될 수 있습니다. 자세한 내용은 Reduce Function을 참조하십시오.

지도 :

m = function(){ emit(this.type, {names:this.name}); } 

감소 :

r = function(key, values){ 
    var all = []; 
    values.forEach(function(x){ 
    all.push(x.names) 
    }) 
    return {"names": all.join(", ")}; 
} 

사용 :

res = db.users.mapReduce(m,r); db[res.result].find() 

알을 테르 나테 :

m = function() { 
    emit(this.type, {names:this.name}); 
} 

r = function (key, values) { 
    var all = []; 
    values.forEach(function (x) {all.push(x.names);}); 
    return {type:key, names:all}; 
} 

f = function (w, r) { 
    r.names = r.names[0]; 
    return r 
} 

res = db.users.mapReduce(m,r, {finalize:f}); db[res.result].find() 

건배 : OP의 요청에 따라

, 여기에 대신 쉼표로 구분 된 목록 문자열의 이름 배열을 반환하는 버전입니다!

+1

멋지다 ... 이제 코드를 수정하여 쉼표로 구분 된 목록 대신 배열에 이름을 포함 시키면 어떻게됩니까? 필요하면 클라이언트에서 쉼표로 구분 된 목록을 작성할 수 있습니까? 반품 만하면됩니다. { "names": all}; 지도 함수에서 작동하지만 내게 [0] => 배열 ( [0] => 배열 ( [0] => 배열 ( [0] => 배열 ( [0] => 배열 ( [0] => 배열 ( –

+0

) 아, 네 의도가 무엇인지 확신 할 수 없으므로 코드를 기반으로 추측 했으므로 배열 예제를 포함하도록 대답을 수정하겠습니다. –

관련 문제