2013-04-12 5 views
1

MongoDB에 초보자 인 MapReduce 호출을 시도하려고합니다. 는 불행하게도 나는 다음과 같은 오류 얻을 :Mongo Map 오류 줄이기

mongos> db.events.mapReduce(m,r,"errors"); 
Fri Apr 12 11:39:15.637 JavaScript execution failed: map reduce failed:{ 
    "ok" : 0, 
    "errmsg" : "MR parallel processing failed: { errmsg: \"exception: reduce -> multiple not supported yet\", code: 10075, ok: 0.0 }" 
} at src/mongo/shell/collection.js:L970 
mongos> 

내가 몽고 2.4.0을 사용하고 있습니다를

내 이벤트 컬렉션과 같습니다

{ "sid" : "1UADM45MCGRTW ", "time" : ISODate("2013-04-08T11:33:13.229Z"), "class" : "S", "service" : "service1" } 
{ "sid" : "1UADM45MCGRTW ", "time" : ISODate("2013-04-08T11:33:13.229Z"), "class" : "I", "service" : "service1" } 
{ "sid" : "1UADM45MCGRTW ", "time" : ISODate("2013-04-08T11:33:13.236Z"), "class" : "E", "text" : "error message" } 
{ "sid" : "1UADM45MCGRTW ", "time" : ISODate("2013-04-08T11:33:13.239Z"), "class" : "F", "service" : "service1" } 

{ "sid" : "1UDO3H7YUOK08 ", "time" : ISODate("2013-04-08T11:33:08.095Z"), "class" : "S", "service" : "service2" } 
{ "sid" : "1UDO3H7YUOK08 ", "time" : ISODate("2013-04-08T11:33:08.095Z"), "class" : "I", "service" : "service2" } 
{ "sid" : "1UDO3H7YUOK08 ", "time" : ISODate("2013-04-08T11:33:08.173Z"), "class" : "E", "text" : "another error message" } 
{ "sid" : "1UDO3H7YUOK08 ", "time" : ISODate("2013-04-08T11:33:08.188Z"), "class" : "F", "service" : "service2" } 

{ "sid" : "1UDO3JVXIS2UZ ", "time" : ISODate("2013-04-08T11:28:39.480Z"), "class" : "I", "service" : "service1" } 
{ ""sid" : "1UDO3JVXIS2UZ ", "time" : ISODate("2013-04-08T11:28:39.480Z"), "class" : "S", "service" : "service1" } 
{ "sid" : "1UDO3JVXIS2UZ ", "time" : ISODate("2013-04-08T11:28:40.853Z"), "class" : "F", "service" : "service1" } 
{ "sid" : "1UDO3JVXIS2UZ ", "time" : ISODate("2013-04-08T11:28:40.852Z"), "class" : "I", "service" : "service1" } 

내 의도가 얻을 수있는 모든 "E"입니다 "F"항목의 해당 "sid"의 "service"필드와 결합하십시오. 그래서 이것은 매우 간단해야하지만 나는 그것을 얻을 수 없었다 (위의 오류 때문에).

지도/I가 사용되는 기능 감소 : 서에 따라

var m = function() { 
    if (this.class == "E") { 
     value = { time: this.time, error: this.text }; 
     emit(this.sid, value); 
    } else if (this.class == "F") { 
     value = { service: this.service }; 
     emit(this.sid, value); 
    } 
} 


var r = function(key,values) { 
    return values; 
} 

db.events.mapReduce(m,r,"errors"); 

답변

4

문제는 각 키에 대한 모든 오류를 누적하기를 원한다는 것입니다. 즉, 문서 배열을 내 보내야하고 그런 다음 reduce를 단일 배열로 결합해야한다는 것입니다. 배열).

다른 문제는 결합 된 감소 된 결과에 각 고유 한 cid의 서로 다른 클래스를 결합하려는 것이지만 reduce 기능은 그렇게하려고 시도하지 않습니다.

그것은 당신이 각 SID를 얻을 수있는 방법을 많은 다른 수준의 값을 알고 열심히하지만 당신이 준 예를 들어 데이터처럼 있다면, 난 당신이 뭔가 원하는 같은데요 : 귀하의 예제에서

var m = function() { 
    array = []; 
    if (this.class == "E") { 
     value = { time: this.time, error: this.text }; 
     array.push(value); 
     emit(this.sid, {a:array}); 
    } else if (this.class == "F") { 
     value = { service: this.service }; 
     array.push(value); 
     emit(this.sid, {a:array}); 
    } 
} 


var r = function(key,values) { 
    result = {a:[]}; 
    values.forEach(function (v) { 
     result.a = v.a.concat(result.a); 
    }); 
    return result; 
} 

db.events.mapReduce(m,r,"errors"); 

을, 결과 수집은 다음과 같이 표시됩니다

> db.errors.find().pretty() 
{ 
    "_id" : "1UADM45MCGRTW ", 
    "value" : { 
     "a" : [ 
      { 
       "service" : "service1" 
      }, 
      { 
       "time" : ISODate("2013-04-08T11:33:13.236Z"), 
       "error" : "error message" 
      } 
     ] 
    } 
} 
{ 
    "_id" : "1UDO3H7YUOK08 ", 
    "value" : { 
     "a" : [ 
      { 
       "service" : "service2" 
      }, 
      { 
       "time" : ISODate("2013-04-08T11:33:08.173Z"), 
       "error" : "another error message" 
      } 
     ] 
    } 
} 
{ 
    "_id" : "1UDO3JVXIS2UZ ", 
    "value" : { 
     "a" : [ 
      { 
       "service" : "service1" 
      } 
     ] 
    } 
} 

당신은 아마 단일 문서의 결과로이 배열을 변환하는 마무리 기능을 추가 할 수 있습니다하지만 당신이 가지고 원하는 결과 집합의 형식에 따라 달라집니다 각 sid의 예상 입력.

+0

매우 도움이됩니다. 감사합니다. – pitseeker

0

을 (troubleshoot reduce function) "누구의 유형에 의해 방출 된 값의 형식과 동일해야 객체를 반환해야 기능을 줄일 지도 기능 "

개체를 방출 할 때 reduce도 개체를 내야합니다. 따라서 개체에 values을 입력하면 잘 처리해야합니다.