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})
샤드 환경에서 데이터베이스를 실행할 것으로 예상됩니다.이 경우 mapReduce가 더 효율적입니다. 동시에 100k 사용자가있는 경우 반복하여 mapReduce를 호출 할 때마다 리소스를 많이 소비하는 작업과 그 차단 작업이 필요합니다. 이것은 나를 혼란스럽게합니다. 고맙습니다. –
2.2 집계 프레임 워크는 샤드 드 콜렉션을 지원하며 온 디맨드 쿼리의 경우 MR보다 훨씬 빠르지 만 주요 문제는 RAM에서 모든 것을 처리해야한다는 것입니다. 그래서 여전히 큰 컬렉션에 대해서는 여전히 문제입니다. 집계는 아직 빠르지는 않지만 2.2 JS 엔진을 능가하는 머리와 어깨로. MR은 JS 엔진을 사용하고 있으며 주문형으로는 실제로 사용할 수 없습니다. 빌드하는 데 걸리는 시간이 중요하지 않을 때 미리 계산하고 캐시 할 수있는 기능에 훨씬 더 적합합니다. – cirrus
몇 가지 샘플 DB 스키마 데이터를 게시하고 원하는 출력을 표시하면 집계 쿼리를 작성할 수 있습니다. – cirrus