2013-02-01 4 views
3

나는 약 100,000 개의 문서 (sharded되지 않음)가있는 mongodb에 상당히 많은 모음을 가지고 있습니다. 이것은 기본적으로 사용자가이 컬렉션의 동일한 정보를 볼 수있는 다양한 방법을 탐색 할 수있게하는 웹 응용 프로그램의 백엔드입니다.Mongodb 집계 결과 캐싱

보기 중 하나에 대해 나는 집계 프레임 워크를 사용하여 필드의 발생 횟수를 계산하려고합니다. 이것은 전체 컬렉션을 모으는 것을 의미합니다. 문제는이 집계 작업 (그룹, 정렬 및 제한의 간단한 파이프 라인)은 웹 응용 프로그램에 비해 너무 느린 2 초가 걸린다는 것입니다.

제 질문은; 이 집계 연산의 결과를 캐시하기 위해 선호되는 솔루션은 무엇입니까? 내가 아는 한, 새로운 콜렉션 또는 그와 유사한 것을 "집계"하는 것은 불가능합니다. 현재 내가 찾은 유일한 해결책은 전체 결과를 변수로 읽은 다음 삽입을 사용하여이 변수를 새 컬렉션에 삽입하는 것입니다. 그러나 데이터베이스에서 많은 양의 데이터를 보내는 것이 두려워요>>> 다시 데이터베이스로?

제안 사항? 파이프 라인의

예 :

res = items.aggregate([ 
    { "$group": { "_id": { "item_id": "$item_id", "title": "$title", "category": "$category" }, "count": { "$sum": 1 } } }, 
    { "$sort": { "count": -1 } }, 
    { "$limit": 5 } 
]) 

스키마는 기본적으로 그 3 개 필드 + 정말, 관련이없는 그 이상을 몇 가지 예 : 나는 모든 둘 ITEM_ID과에 인덱스를 시도

doc = { 
    "item_id": 1000, 
    "title": "this is the item title", 
    "category": "this is the item category" 
} 

3 개의 필드는 성공하지 못합니다.

+1

아마도 문서의 예제 구조와 집계 파이프 라인의 단계를 제공 할 수 있다면 유용 할 것입니다. 색인을 사용합니까? – attish

답변

1

집계는 결과를 하나의 문서로 반환합니다. 결과는 16M로 제한됩니다. 문서가 앱으로 반환됩니다.

컬렉션에 "집계"하려면 map-reduce를 사용하십시오.

map_function = function() { 
     emit(this.item_id, {"item_id": this.item_id, /* any other info */ "count": 1}); 
}; 

reduce_function = function (key, values) { 
     var result = {"item_id": key, /* any other info should be given from one or any of values array objects */ "count": 0}; 
     values.forEach(function (value) { 
       result["count"] += value["count"]; 
     }); 
     return result; 
}; 

구조적인 값을 낼 수 있는지 여부는 잘 모릅니다. 시도해보십시오. BTW 방출 중요한 분야는 좋다.

+0

그래서 map-reduce를 사용하여이 문제를 해결할 수 있습니까? – agnsaft

+0

답변을 추가했습니다. –