2014-03-27 116 views
1

比方說,我想將百萬篇博客&新聞文章存儲到一個mongodb服務器。Mongodb實時聚合和存儲設計?

這些文章將有一些我可以用於聚合的領域,例如:類別,作者,位置,域等等。我可以將這些文章存儲在mongo數據庫中,但那些文章也有文本,摘要等字段包含相當多的數據,並可能使文檔相當大(仍然< 16MB)

我的問題是什麼時候mongodb運行聚合,它是否將整個文檔讀入內存並從那裏做聚合?顯然,所有來自磁盤的數據都無法放入內存。文檔的大小是否會影響聚合性能?

什麼是良好的設計/替代存儲&「REALTIME」聚合?

我不想爲我的項目使用像Hadoop這樣的批處理過程,因爲實時聚合是必須的。我已經看到了2個mongo dbs的設置,其中1個用於存儲原始文檔的存儲,另一個僅用於星型模式中的聚合存儲字段,但我不太喜歡這種方法,因爲它需要維護2個版本一個文件在2個地方。

謝謝。

+0

這是一個[「太寬泛」](http://stackoverflow.com/help/dont-ask)這樣一個問題。嘗試縮小到某個特定的或可能將其分解成您的問題的一部分。 –

回答

1

我的問題是當mongodb運行聚合時,它是否將整個文檔讀入內存並從那裏進行聚合?

沒有,因爲新版本的出現了投影是如何工作的一個變化,現在它能夠使用覆蓋查詢,或者更確切地說,部分負荷:http://docs.mongodb.org/manual/core/aggregation-pipeline-optimization/#projection-optimization

優化階段投影適用於這個管道的頭部使得只有_id和數量字段也會從$ match階段返回到結果文檔中。

因此,您可以加載文檔的位,而不必擔心加載整個文本內容等。

文檔大小是否會影響聚合性能?

它影響任何操作。即使分配在硬盤上是連續的,文檔越大,加載IO所需的IO就越多。

它也可以影響,如您所述,內存使用情況。您的工作集可能會發現較大文檔的問題,您可能會遇到頁面顛簸。

什麼是良好的設計/替代存儲&「REALTIME」聚合?

與增量映射預聚合減少是一個不錯的選擇:http://docs.mongodb.org/ecosystem/use-cases/pre-aggregated-reports/我個人用它遠遠超過了聚合框架,以更大的成功。

我不想爲我的項目使用像Hadoop這樣的批處理過程,因爲實時聚合是必須的。

「實時」?什麼是「實時」?當用戶等待服務器處理大約30分鐘的數據或者用戶數據被延遲了2分鐘,用戶沒有等待頁面加載時間等時,它是否就位?

如果您需要高粒度,那麼您可以使更新之間的等待時間更接近5秒。

實時並不總是在現場處理,只是看看在這方面的許多其他網站。

+0

感謝@Sammaye的回答。當我說實時時,我的意思是數據應該能夠在插入後立即讀取/聚合。用戶應等待30秒的適當時間才能返回聚合結果。聚合過程不會發生在整個數據集上,但它將與userId或某個特定用戶相關。例如,可以爲客戶A構建來自上個月前10個域的新聞文章的圖表。這就是爲什麼我說Hadoop不是我用例的理想選擇。 –

+0

@VanThoaiNguyen是的,與增加我會首先看到,如果聚合是不是太慢,如果是的話,我會轉移到預先彙總 – Sammaye

+0

不幸的是,預先聚合可能沒有幫助我的情況,因爲我存儲重複的文件,有關不同的用戶。由此,用戶可以用他們的方式評價,更改,刪除他們的新聞項目。會有很多聚合和過濾器的組合,因此預聚合不能適合。 –