【问题标题】:Mongo MapReduce select latest dateMongo MapReduce 选择最新日期
【发布时间】:2012-10-08 16:20:22
【问题描述】:

我似乎无法让我的 MapReduce reduce 函数正常工作。这是我的地图功能:

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
        }   
    ); 

}

这是我的 reduce 函数:

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;

}

我想检索分组对象的最新日期。我做错了什么?

【问题讨论】:

  • 看起来你已经在你的reduce函数中声明了“result”作为一个数组。尝试将其更改为 var result = { timestamp: 0 }; 看看是否有帮助。

标签: mongodb mapreduce


【解决方案1】:

您是否考虑过使用以下任一方法?

在集合中查找 MAX timeStampField

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

或者:

查找集合中每个 user_id 的最大 timeStampField(如果 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; 
                  }
              }
  }
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多