2012-07-31 4 views
4

다음지도를 사용하여 그룹의 최대 날짜를 알려주는 함수를 줄였습니다.지도의 예상치 못한 출력이 줄어 듭니다.

지도 :

function() { 
    if (this.topic_id != 0) { 
     emit(this.topic_id, {date_posted : this.date_posted}); 
    } 
} 

가 감소 : 순간

function (key, values) { 
    var re_date = ISODate('1970-01-01T00:00:00Z'); 
    values.forEach(function (value) { 
     if (re_date == ISODate('1970-01-01T00:00:00Z')) { 
      re_date = value.date_posted; 
     } 
     if (re_date < value.date_posted) { 
      re_date = value.date_posted; 
     } 
    }); 
    return {date_posted: re_date}; 
} 

를, 다음과 같은 출력을주고있다 :

{ "_id" : "1", "value" : ISODate("2010-06-01T13:36:30Z") } 
{ "_id" : "10", "value" : { "date_posted" : ISODate("2010-05-19T21:33:16Z") } } 
{ "_id" : "1000", "value" : { "date_posted" : ISODate("2010-07-04T04:09:43Z") } } 
{ "_id" : "1004", "value" : ISODate("2010-07-05T01:27:53Z") } 
{ "_id" : "1007", "value" : { "date_posted" : ISODate("2010-07-04T23:44:56Z") } } 
{ "_id" : "1009", "value" : ISODate("2010-08-12T19:05:35Z") } 
{ "_id" : "1012", "value" : ISODate("2010-08-14T19:56:35Z") } 
{ "_id" : "1014", "value" : { "date_posted" : ISODate("2010-07-05T07:18:56Z") } } 
{ "_id" : "1022", "value" : ISODate("2010-07-06T21:17:57Z") } 
{ "_id" : "1024", "value" : { "date_posted" : ISODate("2010-07-06T12:37:28Z") } } 
{ "_id" : "1028", "value" : ISODate("2010-07-08T00:24:59Z") } 
{ "_id" : "1029", "value" : ISODate("2010-07-26T12:08:34Z") } 
{ "_id" : "1042", "value" : { "date_posted" : ISODate("2010-10-01T19:22:29Z") } } 
{ "_id" : "1043", "value" : { "date_posted" : ISODate("2010-07-20T01:38:44Z") } } 
{ "_id" : "1048", "value" : { "date_posted" : ISODate("2010-07-08T19:29:14Z") } } 
{ "_id" : "1049", "value" : ISODate("2010-07-08T11:07:30Z") } 
{ "_id" : "105", "value" : ISODate("2010-05-21T01:53:20Z") } 
{ "_id" : "1053", "value" : { "date_posted" : ISODate("2010-07-08T17:53:57Z") } } 
{ "_id" : "1056", "value" : { "date_posted" : ISODate("2010-07-08T22:35:02Z") } } 
{ "_id" : "1060", "value" : { "date_posted" : ISODate("2010-07-09T06:33:57Z") } } 

내가 기대되었다 그 모든 행에 대한 값 필드 항상 "date_posted"요소를 가지지 만 분명히 일부만이 있습니다. 지도 기능에 실수가 있습니까?

원본 데이터의 샘플 :

db.posts.find({"topic_id" : {$in : ["105", "1053", "1000", "1004", "1007"]}}, {"date_posted" : 1, "topic_id" : 1}) 

{ "_id" : "1010", "date_posted" : ISODate("2010-07-05T01:27:53Z"), "topic_id" : "1004" } 
{ "_id" : "106", "date_posted" : ISODate("2010-05-21T01:52:59Z"), "topic_id" : "105" } 
{ "_id" : "107", "date_posted" : ISODate("2010-05-21T01:53:20Z"), "topic_id" : "105" } 
{ "_id" : "1001", "date_posted" : ISODate("2010-07-04T04:09:43Z"), "topic_id" : "1000" } 
{ "_id" : "1006", "date_posted" : ISODate("2010-07-04T23:21:30Z"), "topic_id" : "1004" } 
{ "_id" : "1008", "date_posted" : ISODate("2010-07-04T23:44:56Z"), "topic_id" : "1007" } 
{ "_id" : "1054", "date_posted" : ISODate("2010-07-08T17:53:57Z"), "topic_id" : "1053" } 
+0

수를하고있는 * 값 *지도 입력의 일부 date_posted는 뭔가처럼의' { "date_posted": ISODate ("2010-10-01T19 : 22 : 29Z")}'? –

+0

이이 질문에서 사용했던 것과 동일한 문제입니다. http://stackoverflow.com/questions/11742986/php-mongodb-map-reduce-db-assertion-failure? –

+0

@ChrisShain 그러나 MR은 일부 데이터를 날짜로, 일부를 문자열로 어떻게 성공적으로 실행할 것입니까? –

답변

1

이 좋아, 그것은 최대 날짜를 얻기를위한 나의 논리처럼 보인다는 엉망이된다. 나는 그 질문에 대한 응답으로 윌리엄 Z에 의해 게시 관련 문제와 코드에 대한 different question가 더 잘 작동 게시했다 :

function (key, values) { 
var re_date = ISODate('1970-01-01T00:00:00Z'); 
values.forEach(function (val) { 
if (re_date < val.date_posted) 
re_date = val.date_posted; 
} 
); 
return {date_posted : re_date}; } 
관련 문제