2011-02-25 84 views
3

我有一個用於測量的mongodb,每個測量都有一個文檔。每個文檔看起來像:如何通過平均舊數據來減少Mongo db

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

我每秒鐘從多個來源獲取測量值,因此db變得很大,很快。我有興趣將最新的信息保存在讀取的頻率中,但我希望定期平均以保存空間,並使db更快一些。

1. mongo中最好的方法是什麼?

2.考慮到模式對於不同的測量是不同的,並且固定格式不能很好地工作,是否還有更好的分貝數據庫。 RRD也不是一個選項,因爲我需要動態查詢功能。

回答

2
  1. 我不知道的最好的方法,但一個簡單的辦法是有一個cron作業,將刪除所有小於給定的時間戳(your_time = now - some_time)較舊的文件。

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

  2. 既然你需要一個無模式數據庫,使您可以執行動態查詢,mondogb似乎是一個不錯的選擇。

+0

+1,適合後臺工作,加上MongoDB非常適合 – AdaTheDev 2011-02-25 10:32:39

+0

正如上面的評論,我想平均說3個文檔,1個新文檔,而不是完全刪除它們。我認爲cron的工作肯定會成爲前進的道路(或類似的道路)。 – Duncan 2011-02-25 10:38:14

+0

這裏有什麼問題?只需創建一些進程並將其配置爲每日運行或按照您的意願運行併合並/刪除/移動/更新您的集合。 – 2011-02-25 10:45:14

4

1.什麼是mongo的最佳方法?
使用capped collections用於記錄等用例。另一種方法是創建一個「後臺進程」,將從收集中移動舊數據。

2.考慮到模式對於不同的測量是不同的,並且固定格式不能很好地工作,是否有更好的分貝。 RRD也不是一個選項,因爲我需要動態查詢功能。
Mongodb在這裏很適合。

更新: 另一個計算策略是存儲每個數據項兩次:第一次在加蓋收集(並使用此集合quering)。並創建另一個集合(甚至是另一個logdb)來記錄您的事件。

+0

+1作爲潛在的封頂集合,但在OP的情況下是概率背景過程。加上MongoDB是一個很好的適合 – AdaTheDev 2011-02-25 10:33:25

+0

封頂的集合是偉大的,但我不認爲他們會滿足我的需要。我想保留數據,但是通過將來自3個文檔的值平均(例如)爲單個文檔來減少數據。 – Duncan 2011-02-25 10:36:29

+0

可能的兩種方式:1.刪除舊數據的後臺進程。 2.在封頂收集和日誌收集中存儲兩次數據。 – 2011-02-25 10:42:14

3

感謝您的意見。

我想我會嘗試使用不同時間段的桶。所以,我會創建3個相應的商店,比如說1秒,1分鐘,15分鐘,然後通過手動工作管理聚合,每隔一段時間運行一次,這樣可以壓縮/平均值,刪除不需要的東西等等。

+0

一般來說,這是最簡單的方法。每個大時間範圍(小時/天)構建一個文檔,然後在該文檔中添加$ push/$ inc數據。以這種方式過期舊數據會更容易,坦率地說,查詢更容易(返回24小時文檔,而不是86400「其次」文檔)。它避免了重複數據,同時節省空間。僅供參考,爲了節省更多空間,請注意縮小字段名稱。使用「ts」代替「timestamp」,而不是「value」使用「v」等。 – 2011-02-25 19:31:15