2011-01-28 2 views
1

나는 효율적으로 해결하는 방법을 모르겠다는 문제점이있다. 나는 (매일 많은 문서가있을 수 있습니다 매일 number_of_hits의 합계를 얻을 필요가MongoDB를 사용하여 한 컬렉션의 데이터를 다른 컬렉션으로 효율적으로 집계하는 방법은 무엇입니까?

stats = { 
    'day': '', 
    'total_number_of_hits': 0 
    'user_id': 0 
    ... 
    some other stuff 
} 

1)

hits = { 
    'day': '', 
    'number_of_hits': 0 
    'user_id': 0 
} 

2) :

나는 두 개의 컬렉션을 가지고 다양한 숫자의 조회수가 포함 된 포함)를 사용하고 가능한 가장 빠른 방법으로 통계 합계를 업데이트합니다. 히트 컬렉션에있는 각 user_id에 대해이 작업을 수행해야합니다.

예를 들어 히트 컬렉션에 대한 집계를 가져온 다음 예를 들어 얻을 수 있습니다. 루프 업데이트 통계 수집.

하지만 뭔가 좋은 방법이 아니라고 말하고 있습니다.

때때로 stats 컬렉션에는 문서가 없을 수도 있으므로 업데이트되는 대신 으로 만들어야합니다. 당신이 나에게 어떤 아이디어를 얻을 수있는 경우

그것은 놀라운 것입니다 :)

이 PabloX 감사

답변

3

당신이

stats{ 
    'day': '', 
    'user_id': 0, 
    'hits':{ 
     // Array of your hits document 
    } 
} 

로 구조 만 얻을 디자인을 다시 시도 할 수 있음 모든 히트 한 문서. 언제든지 합계를 계산할 수 있습니다.

+0

재미있는 아이디어 :

나는이는 파이썬으로 수행하는 방법을 확실하지 않다, 그러나 몽고에 대한 문서를 체크 아웃 한도. 하지만 히트가 수집되는 방식을 바꿀 수 있다면 그 한계가 문제가되지 않을 것이라고 생각합니다. – pablox

+0

또한 데이터베이스에 대한 연결 수를 줄입니다. –

+0

당신의 솔루션은 잘 작동합니다. 고마워요. – pablox

0

문제는 Mongo의지도/축소 기능의 전형적인 경우처럼 보입니다. 자세한 내용은 http://www.mongodb.org/display/DOCS/MapReduce을 참조하십시오.

map/reduce로 조심해야 할 것이 하나 있습니다. 사용중인 Mongo 버전 (1.4.5)에서 map/reduce를 수행하면 모든 독자와 작성자를 잠그는 데이터베이스 잠금이 획득됩니다. Mongo의 최신 버전에서 이것이 여전히 문제인지 아닌지 확실하지 않습니다.

0

또 다른 아이디어는 $ inc 연산자를 사용하는 업데이트 일 것입니다. 기본적으로 user_id 및 date와 일치하는 문서가 존재하면 히트 수를 1만큼 증가시키고, 그렇지 않으면 하나를 삽입하십시오.

모든 히트를 기록해야하는 경우가 아니라면 가장 효율적인 방법입니다. 나는 하나의 문서가 4-8메가바이트 이상 갈 수 있다는 걱정을 :) 감사

http://www.mongodb.org/display/DOCS/Updating#Updating-%24inc

관련 문제