Javascript 减少误解。
我正在编写第二个mapReduce,从一个包含“活动”嵌套文档的集合中获得上周为每个用户播放的前十首歌曲,该文档包含歌曲id、计数器和日期数组。计数器表示歌曲的“播放时间” 我尝试使用mapReduce,我能够完成这项任务,并且只使用“map”输出所需的结果,而不需要减少发出的值。这是我使用的错误方法吗?这样做的最佳方法是什么 以下是地图功能:Javascript 减少误解。,javascript,mongodb,mapreduce,mongodb-query,Javascript,Mongodb,Mapreduce,Mongodb Query,我正在编写第二个mapReduce,从一个包含“活动”嵌套文档的集合中获得上周为每个用户播放的前十首歌曲,该文档包含歌曲id、计数器和日期数组。计数器表示歌曲的“播放时间” 我尝试使用mapReduce,我能够完成这项任务,并且只使用“map”输出所需的结果,而不需要减少发出的值。这是我使用的错误方法吗?这样做的最佳方法是什么 以下是地图功能: 您不应该需要reduce功能。根据输入数据,这是不必要的,我会解释原因 为了以简化的方式调用,在MapReduce中,mapper函数接受输入并按键将其
您不应该需要
reduce
功能。根据输入数据,这是不必要的,我会解释原因
为了以简化的方式调用,在MapReduce中,mapper函数接受输入并按键将其拆分,然后将(键,值)
对传递给reducer。然后,减速机将(键,[值列表])
对聚合为一些有用的输出
在您的例子中,键是用户ID,值是他们听过的前10首歌曲。按照数据布局的方式,它已经组织成了(键,[值列表])
对。您已经拥有一个键,该键后面是与其关联的每个值的列表。用户ID与他们刚听过的每首歌曲一起列出,因此无需减少
基本上,reduce
步骤将把每个(用户ID,歌曲)
对组合成一个用户歌曲列表。但这已经完成了。这是数据中固有的。因此,在本例中,映射器是完成本例所需功能的唯一必要功能。为了帮助我们理解手头的问题,您能否发布一个示例文档以及MR的结果?这是一个示例文档,最重要的部分是嵌套活动文档。
var map = function() {
user_top_songs = [];
user_songs = [];
limit = 10;
if(this.activities !== undefined){
key = {user_id:this.id};
for (var i=0; i < this.activities.songs.length; i++){
if (this.activities.songs !== undefined && this.activities.songs[i].date.getDate() > (new Date().getDate()-7))
user_songs.push([this.activities.songs[i].song_id, this.activities.songs[i].counter]);
}
if(user_songs.length !== 0){
user_songs.sort(function(a,b){return b[1]-a[1]});
if(user_songs.length < 10 )
limit = user_songs.length;
for(var j=0; j < limit; j++)
user_top_songs.push(user_songs[j]);
}
value = {songs:user_top_songs};
emit(key,value);
}
}
var reduce = function(key, values) {};