2012-10-08 158 views
4

我似乎無法讓我的MapReduce reduce功能正常工作。這裏是我的地圖功能:Mongo MapReduce選擇最近日期

function Map() { 
    day = Date.UTC(this.TimeStamp.getFullYear(), this.TimeStamp.getMonth(),this.TimeStamp.getDate()); 

    emit(
     { 
      search_dt: new Date(day), 
      user_id: this.UserId 
     },     
     { 
      timestamp: this.TimeStamp 
     } 
    ); 

} 

這裏是我的減少功能:

function Reduce(key, values) { 

    var result = [timestamp:0]; 

    values.forEach(function(value){ 
     if (!value.timestamp) 
      continue; 
     if (result.timestamp < value.timestamp) 
      result.timestamp = value.timestamp; 
    }); 
    return result; 

} 

我要檢索的分組對象的最新日期。我究竟做錯了什麼?

+2

看起來你已經宣佈「結果」了是你的reduce函數中的一個數組。嘗試將其更改爲'var result = {timestamp:0};'並查看是否有幫助。 – themanatuf

回答

0

您是否考慮過使用以下兩種方法之一?

找到MAX timeStampField集合中:

db.collectionName.ensureIndex({ "timeStampField": -1 }); 
db.collectionName.find({},{"timeStampField":1}).sort({timeStampField:-1}).limit(1); 

OR:

找到MAX timeStampField,每集合中user_id說明(如果DB不是分片):

db.collectionName.group(
    { key: { "user_id" : 1 } 
    , initial: { maxTimeStamp : new Timestamp() } 
    , cond: { timeStampField : {$exists : true}, timeStampField : {$gt: new Timestamp()} } 
    , reduce: function(doc,out) { 
        if (out.maxTimeStamp < doc.timeStampField) { 
         out.maxTimeStamp = doc.timeStampField; 
        } 
       } 
    } 
);