2013-07-05 16 views
1

지도 축소 기능을 사용하고 있습니다. 문제는 만약 그렇다면 문서의 입력이 100을 넘으면 예상되는 번호가 표시되지 않습니다. 결과가 아니라면 입력 문서가 < = 100이면 예상대로 결과를 얻고 있습니다. 사용자에 대한 < = 100 문서 (ID : 5504)에있을 경우 : 나는 점점 오전Mongodb -지도 - 축소 - 전체 데이터가 반환되지 않습니다.

샘플 출력 :

{ 
    "_id" : "5504", 
    "value" : [ 
      ObjectId("51c921bae4b0f0f776b339d2"), 
      ObjectId("51b06b5be4b021e44bc69755") 
    ] 
} 

문제는, 나는 많은 어떤 것을 얻고있다. 출력 배열의 ID 수는 문서> 100 이상이면 출력 배열에 ID가 거의 없습니다. 나는 위의 결과를 얻었다. 이 사용자의 문서 수는 101 개 였지만 100 일 때 100 개의 ID를 받았습니다. 왜이 이상한 행동과 이것에 대한 해결책이 무엇입니까?

지도 기능 :

db.system.js.save({ 

    _id: "map1", 

    value: function() { 
     var value = { 
      "data": [{ 
       "_id": this._id, 
       "creation_time": this.creation_time 
      }] 
     }; 
     emit(this.user_id, value); 
    } 
}); 

감소 기능 :

db.system.js.save({ 

    _id: "reduce1", 

    value: function (key, values) { 
     var reducedValue = []; 
     for (var i = 0; i < values.length; i++) { 
      reducedValue.push({ 
       "_id": values[i].data[0]._id, 
       "creation_time": values[i].data[0].creation_time 
      }); 
     } 
     return { 
      data: reducedValue 
     }; 
    } 
}); 

의 Finalize 기능 :

db.system.js.save({ 

    _id: "finalize1", 

    value: function (key, reducedValue) { 
     var a = reducedValue.data.sort(compare1); 
     var ids = []; 
     for (var i = 0; i < a.length; i++) { 
      ids.push(a[i]._id); 
     } 
     return ids; 
    } 
}); 

비교 기능 :

db.system.js.save({ 

    _id: "compare1", 

    value: function (a, b) { 
     if (a.creation_time < b.creation_time) return 1; 
     if (a.creation_time > b.creation_time) return -1; 
     return 0; 
    } 
}); 

맵리 듀스() 함수 많은 시간을 단축 부를 수 MongoDB를 이후

db.notifications.mapReduce(map1, reduce1, {out: "notifications_result", query: {delivered:true, user_id:"5504"}, finalize: finalize1}); 
+0

나는 이것이 당신을 도울 수 있다고 생각합니다 : http://stackoverflow.com/questions/13318791/mapreduce-results-seem-limited-to-100 –

+0

그리고 this this too : http://stackoverflow.com/questions/9896349/what-is-wrong-with-this-map-reduce-query-on-mongo –

답변

1

전화, 당신은 Function Idempotence를 확인해야합니다. 지금 values[i].data 배열이 너무 이송합니다

db.system.js.save({ 

    _id: "reduce1", 

    value: function (key, values) { 
     var reducedValue = []; 
     for (var i = 0; i < values.length; i++) { 
      for(var j = 0; j < values[i].data.length; j++) { 
       reducedValue.push({ 
        "_id": values[i].data[j]._id, 
        "creation_time": values[i].data[j].creation_time 
       }); 
      } 

     } 
     return { 
      data: reducedValue 
     }; 
    } 
}); 

참고 다른 reduce1 통화 are in the values array의 반환 이유는 당신의 감소 기능에 약간의 수정은 문제를 해결한다.

+0

+1 예, 내 문제를 해결했습니다. –

+0

도 https://groups.google.com/d/msg/mongodb에 질문하고 대답했습니다. -user/EhNEbyB9UBA/YgwELC3e91sJ –

관련 문제