2010-11-19 3 views
2

를 생성 :MongoDB의 집계 데이터는 I 아래의 것과 같은 문서가있는 MongoDB를 수집해야 '최근 활동'

[ 
    { 
    :event => {:type => 'comment_created'}, 
    :item => {:id => 10}, 
    :created_at => {:t => '11:19:03 +0100 2010', :d=> 'Fri, 19 Nov 2010'} 
    } 

, 
    { 
    :event => {:type => 'vote_created'}, 
    :item => {:id => 10}, 
    :created_at => {:t => '11:19:03 +0100 2010', :d => 'Fri, 19 Nov 2010'} 
    } 
] 

내가 필요하면 (현재의 날)을 '대시 보드'최신 활동을 집계을 구축하는 것입니다 각 항목에 대해 결과는 다음과 같을해야

결과는 같은 '페이스 북 스타일'구문을 구성하는 데 사용된다

{ 
:item_id => 10, 
:events => { 
    :vote_created => [.. ordered list with latest 3 vote_created events/documents], 
    :comment_created => [.. ordered list with latest 3 comment_created events/documents ], 
    } 
} 
'. 귀하의 항목 마이크, 존 외 3 인이 추가 댓글 오늘'

그룹 또는지도 축소 기능을 사용하여이 데이터를 어떻게 집계 할 수 있습니까? 당신이지도-감소 실행할 수 있습니다, 그래서 처음

을지도-감소 :

방법 # 1 :

답변

4

OK,이 작업을 수행하는 두 가지 방법이 있습니다 그룹이 아니야.

새 컬렉션을 생성 할 "out"변수와 함께 Map-Reduce를 사용하십시오. 그런 다음 새 컬렉션에 대해 요약 쿼리를 ​​실행할 수 있습니다.

이렇게하는 이유는 값 비싼 쿼리를 요청하는 것이므로 "적당하지 않은"실시간으로 액세스하는 것이 훨씬 합리적입니다.

방법 # 2 : 당신은 기본적으로 두 가지 컬렉션 "세부 사항"(위 하나)와 "요약"(한 바닥)을 유지할 수

을 두 번 기록합니다. 세부 사항에 글을 쓸 때마다 요약 업데이트도 수행하십시오.

MongoDB에는 "vote_created"배열을 최신 상태로 유지할 수있는 여러 가지 배열 방법 ($push, $pull, $slice)이 있습니다.

환경

완전히 선택하는 방법은 당신이 가지고있는 아키텍처의 종류와 원하는 사용자 경험에 따라 달라집니다. 개인적으로, 나는 단지 Method # 2를 사용하고 "vote_created"배열에 계속 덧붙일 것이다. 나는 'Mike, John and 3 others ...'구문을 뷰의 어딘가에 넣을 것인데, b/c는 DB 로직이 아닌 뷰 로직이다.

예 방법 2는 더 많은 공간을 차지하지만 많이 묻는 질문에 대한 빠른 대답을 제공합니다. 그래서 당신은 그 속도를 얻기 위해 공간을 희생해야 할 것입니다.