2011-05-30 63 views
3

我正在使用Map reduce功能使用Mongodb本地驱动程序。基本上我有一个mediaId作为一个关键,并且想要统计每个mediaId加载和启动的媒体数量。 所以我做了什么是:Map Reduce Mongodb Node JS本地驱动程序

var map = function(){ 
     emit(this.media.id, { 
      count: 1, 
      played: 0, 
      ph: this.project.id, 
      title: this.media.title, 
      media: this.media.id, 
      origin: this.origin, 
      thumbnail: this.media.thumbnail, 
      mediaDuration: this.media.mediaDuration, 
      state: this.state 
     }); 
    }; 

    var reduce = function(k, vals) { 
     result = { 
      count: 0, 
      played: 0, 
      ph: '', 
      title: '', 
      media: '', 
      origin: '', 
      thumbnail: '', 
      mediaDuration: 0, 
      state: '' 
     }; 

     vals.forEach(function(doc){ 
      result.count += doc.count; 
      result.ph = doc.ph; 
      result.title = doc.title; 
      result.media = doc.media; 
      result.thumbnail = doc.thumbnail; 
      result.mediaDuration = doc.mediaDuration; 
      result.state = doc.state; 
      result.origin = doc.origin; 
      if(doc.state === "started") { 
       result.played += 1; 
      } 
     }); 
     return result; 
    }; 

在我的测试集我有2个不同的mediaIds。一个拥有553个对象,另一个拥有1个对象。我已经在“开始”状态下进行测试,所以基本上计数的数量应该等于播放的数量。 当我运行的Map/Reduce函数返回给我(我使用MongoDB的本地驱动程序的“指定者”功能):

[ { _id: '12398asdsa9802193810asd120', 
value: 
{ count: 1, 
    played: 0, 
    ph: '123213ased12231', 
    title: 'xxxxxxxxxxxxxxxxxxxxxxxxxxx', 
    media: '1xxxxxxxxxxxxxxxxxxxxxxxxxxx1', 
    origin: 'http://www.google.com', 
    thumbnail: 'http://cache.ohinternet.com/images/0/0e/Forever_Alone.png', 
    mediaDuration: 12321321, 
    state: 'started' } }, 
{ _id: '2c9f94b42f5b5114012f5b92ea430066', 
value: 
{ count: 553, 
    played: 155, 
    ph: '316', 
    title: 'xxxxxxxxxxxxxxxxxxxxxxxxxxx', 
    media: '2xxxxxxxxxxxxxxxxxxxxxxxxxxx2', 
    origin: 'http://localhost:9000/views/index.html', 
    thumbnail: null, 
    mediaDuration: null, 
    state: 'started' } } ] 

看来,一个我只有一个对象的减少功能不叫(我做了一些测试,与其他收藏有超过100个mediaIds和行为是一致的。没有任何人有什么不妥的想法?

非常感谢您的时间, 干杯。

回答

2

我有点解决了“问题” 我在Map Funct上做过滤器而不是Reduce功能。事情是这样的:

var map = function(){ 
    if(this.media.state==="started") { 
     var played = 1; 
}else{var played = 0;} 
    emit(this.media.id, { 
     count: 1, 
     played: played, 
     ph: this.project.id, 
     title: this.media.title, 
     media: this.media.id, 
     origin: this.origin, 
     thumbnail: this.media.thumbnail, 
     mediaDuration: this.media.mediaDuration, 
     state: this.state 
    }); 
}; 

希望它可以帮助被具有相同的“问题”

+2

你应该接受你自己的答案的人。 – OneOfOne 2011-09-29 23:24:18