2011-02-25 3 views
3

측정 당 문서가있는 mongodb가 있습니다. 각 문서는 다음과 같습니다.이전 데이터를 평균하여 Mongo db를 줄일 수있는 방법

{ 
timestamp : 123 
value  : 123 
meta1  : something 
meta2  : something 
} 

매 초마다 여러 소스에서 측정 값을 얻으므로 데이터베이스가 매우 빠르게 커집니다. 최근 정보를 읽은 빈도로 유지하는 데 관심이 있습니다. 그러나 오래된 데이터는 공간을 절약하기 위해 주기적으로 평균을 내고 db를 조금 더 빠르게 만들려고합니다.

1. 몽고에서 가장 좋은 방법은?

2. 스키마가 다른 측정 값에 따라 다르며 고정 된 형식이 제대로 작동하지 않는다는 것을 고려하면 더 나은 데이터베이스가 있습니까? 동적 쿼리 기능이 필요하므로 RRD도 옵션이 아닙니다.

답변

2
  1. 나는 가장 좋은 방법에 대해 확실하지 않다하지만 단순한 하나는 주어진 타임 스탬프 (your_time = now - some_time)보다 오래된 모든 문서를 제거 할 cron 작업을하는 것입니다. 당신이 동적 쿼리를 수행 할 수있는 스키마 데이터베이스를 필요 감안할

    db.docs.remove({ timestamp : {'$lte' : your_time}})

  2. 는 mondogb이 잘 맞는 것 같다.

+0

+1, 백그라운드 작업 및 MongoDB에 더 잘 맞음 – AdaTheDev

+0

위의 설명에서와 같이 평균 3 명의 문서를 1 개의 새 문서로 만들고 싶습니다. 완전히 삭제하지 마십시오. 내 생각에 크론 작업은 앞으로 나아갈 길 (또는 비슷한 것) 일 것입니다. – Duncan

+0

여기에 어떤 문제가 있습니까? 몇 가지 프로세스를 만들고 매일 실행하거나 원하는대로 컬렉션을 병합/삭제/이동/업데이트하십시오. –

4

1. 몽고에서 가장 좋은 접근 방법은 무엇입니까?
로깅과 같은 사용 사례의 경우 capped collections을 사용하십시오. 또 다른 방법은 컬렉션에서 오래된 데이터를 이동시키는 '백그라운드 프로세스'를 만드는 것입니다.

2. 다른 측정에 대해 스키마가 다르다는 점을 감안할 때 더 나은 데이터베이스가 있으며 고정 된 형식이 제대로 작동하지 않습니다. 동적 쿼리 기능이 필요하므로 RRD도 옵션이 아닙니다.
몽고부는 여기에 잘 어울립니다.

업데이트 : 또 다른 approch 두 번 각각의 데이터 항목을 저장하는 것입니다 : 첫째로 덮인 컬렉션 (및 quering이 모음을 사용). 그리고 이벤트를 기록하기위한 또 다른 모음 (또는 다른 logdb)을 만드십시오.

+0

잠재 고객으로는 제한 처리 된 콜렉션에는 +1이 있지만 OP의 경우에는 백그라운드 백그라운드 프로세스 일 수 있습니다. 플러스 MongoDB가 잘 맞는 – AdaTheDev

+0

모자를 쓰는 컬렉션은 좋지만, 나는 그들이 내가 필요한 것을 어울리지 않을 것이라고 생각합니다.나는 데이터를 보존하고 싶지만, 3 개의 문서의 값을 평균하여 (예를 들어) 하나의 문서로 줄인다. – Duncan

+0

가능한 두 가지 방법은 다음과 같습니다. 1. 이전 데이터를 제거하는 백그라운드 프로세스. 2. 데이터를 출처가있는 컬렉션과 로그 컬렉션에 두 번 저장하십시오. –

3

감사합니다.

다른 시간대에 대해 버킷을 사용해 보려고합니다. 그래서 1 초, 1 분, 15 분에 해당하는 3 개의 매장을 만든 다음 수시로 실행되는 수동 작업을 통해 집계를 관리하여 값을 압축/평균화하고 필요하지 않은 항목을 삭제하는 등의 작업을 수행합니다.

+0

일반적으로 이것이 가장 쉬운 방법이다. 큰 시간 범위 (시간/일)마다 하나의 문서를 만든 다음 해당 문서에 $ push/$ inc 데이터를 작성하십시오. 이 방법으로 이전 데이터를 만료하는 것이 더 쉽고 솔직히 쿼리하기가 훨씬 쉽습니다 (86400 개의 "두 번째"문서 대신 24 시간마다 문서 반환). 데이터를 반복하지 않으므로 공간도 효율적입니다. 참고로, 더 많은 공간을 절약하기 위해 필드 이름을 줄이는 방법을 살펴보십시오. "timestamp"대신 "ts"를 사용하고, "value"대신 "v"를 사용하십시오. –

관련 문제