Я использую mapReduce в MongoDB для создания популярных песен для пользователя из его/ее сети друзей. поэтому я перебираю всех пользователей и проверяю, существует ли user_id в их массиве друзей, если он существует, я испускаю их песни, а затем объединяю все выпущенные песни, чтобы найти лучшие песни для всей его сети друзей.
Проблема в том, что мне нужно перебрать всех пользователей, чтобы найти (популярные в сети песни) для каждого пользователя в коллекции. Как я могу это сделать, есть ли способ, похожий на вложенный mapReduce. или мне нужно выполнить итерацию с прикладного уровня, например, выполнить mapReduce через цикл for!.
мой текущий mapReduce, который я использую, таков:
var map = function() {
users = [];
songs = [];
if(this.value.friends !== undefined && this.value.friends.length !== 0 && this.value.songs !== undefined && this.value.songs.length !== 0){
key = this._id.user_id;
for(var x=0; x<this.value.songs.length; x++)
emit({user_id:user_id,song_id:this.value.songs[x][0]},{played:this.value.songs[x][1], counter:1});
}
};
var reduce = function(key, values) {
var counter = 0;
var played = 0;
values.forEach(function(val){
counter += val.counter;
played += val.played;
});
return {played : played, counter : counter};
};
db.runCommand({"mapreduce":"trending_users", "map":map, "reduce":reduce, "scope":{user_id: "111222333444"} ,"query":{'value.friends':{$in : ['111222333444'] }},'out':{merge:'trending_user_network'}})
db.trending_user_network.find({'_id.user_id':'111222333444'}).sort({'value.counter':-1, 'value.played':-1})