2012-09-28 3 views
1

MongoDB에서 mapReduce를 사용하여 친구 네트워크의 사용자 양식에 대한 동향 노래를 생성하고 있습니다. 그래서 모든 사용자를 반복하고 user_id가 친구 배열에 있는지 확인합니다. 존재하는 경우 해당 노래를 내 보낸 다음 전체 노래를 병합하여 모든 친구 네트워크의 최고 노래를 찾습니다.MongoDB에서 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}) 

답변

0

당신은 확실히 사용자 ID를 통해주기에 응용 프로그램에 대한 루프를 사용하여지도 각각에 대해 감소 실행할 수 있습니다. 그러나 이와 같은 경우에는 aggregation framework을 사용하여 한 번에 모든 작업을 수행하는 집계 연산 파이프 라인을 만드는 것이 더 나을 것입니다.

내가 스키마의 정확한 내용을 모르지만, 난 당신이의 라인을 따라 집계 파이프 라인을 구축 할 수 있다고 생각 :

  • $unwind 사용자의 단순 목록을 얻기 위해 자신의 친구 '에 매핑 노래
  • $group 자신의 목록에 친구의 사용자 ID를 매핑하는 사용자 ID
  • 다시
  • $unwind은 결과 물건을 넣어 결과 목록
  • $sort 각 노래의 집계를 얻을 수 순서대로

실제로 파이프 라인에는 몇 가지 단계가 더 필요할 수 있지만지도 축소가 아닌 집계 측면에서이 문제를 살펴본다면 더 간단 할 것입니다.

+0

샤드 환경에서 데이터베이스를 실행할 것으로 예상됩니다.이 경우 mapReduce가 더 효율적입니다. 동시에 100k 사용자가있는 경우 반복하여 mapReduce를 호출 할 때마다 리소스를 많이 소비하는 작업과 그 차단 작업이 필요합니다. 이것은 나를 혼란스럽게합니다. 고맙습니다. –

+1

2.2 집계 프레임 워크는 샤드 드 콜렉션을 지원하며 온 디맨드 쿼리의 경우 MR보다 훨씬 빠르지 만 주요 문제는 RAM에서 모든 것을 처리해야한다는 것입니다. 그래서 여전히 큰 컬렉션에 대해서는 여전히 문제입니다. 집계는 아직 빠르지는 않지만 2.2 JS 엔진을 능가하는 머리와 어깨로. MR은 JS 엔진을 사용하고 있으며 주문형으로는 실제로 사용할 수 없습니다. 빌드하는 데 걸리는 시간이 중요하지 않을 때 미리 계산하고 캐시 할 수있는 기능에 훨씬 더 적합합니다. – cirrus

+0

몇 가지 샘플 DB 스키마 데이터를 게시하고 원하는 출력을 표시하면 집계 쿼리를 작성할 수 있습니다. – cirrus

관련 문제