2012-02-02 95 views
0

在我當前的項目中,我使用了兩個數據庫。如何減少從mongo數據庫同步文檔的數量

  1. 甲MongoDB實例收集來自不同數據提供者的數據(ABT 15M文檔)
  2. 另一個(關係)數據庫實例僅保持所需要的應用程序的數據,即,在MongoDB實例的數據子集。 (abt 5M行)

作爲同步過程的一部分,我需要定期檢查MongoDB中的新條目,具體取決於關係數據庫中的數據。

讓我們說,這是關於歌曲和藝術家,在MongoDB中的文件可能是這樣的:

同步過程的
{_id:1,artists:["Simon","Garfunkel"],"name":"El Condor Pasa"} 

一部分是從已經在存在這些藝術家導入/更新所有歌曲關係數據庫,目前大約有1M位藝術家。

那麼,如何從MongoDB中檢索1M名藝術家的所有歌曲以供導入?

我的第一個想法(和嘗試)是對所有藝術家進行查詢,並查詢每位藝術家的所有歌曲(當然,在「藝術家」字段中有一個索引)。但是這需要花費幾分鐘的時間才能讓每一批1.000名藝術家成爲這個過程的長者。

我的第二個想法是將所有現有的藝術家寫入單獨的mongoDB集合,並擁有超級查詢,該查詢只檢索存儲在那裏的藝術家的歌曲。但到目前爲止,我還沒有能夠基於兩個集合檢索數據。 這是map/reduce的一個很好的用例嗎?如果是的話,有人可以請。給我一個關於如何實現這一點的提示? (我對NoSQL並不是全新的東西,但是當涉及到map/reduce時,這是一個新手。) 或者這個想法太瘋狂了,我必須堅持一個運行好幾天的過程?

在此先感謝您的任何提示。

+0

從Mongo檢索文檔應該相當快。它是否讀取了1000位藝術家數據花費大量時間,還是正在更新花費大量時間的關係數據庫? – user1163459 2012-02-02 12:53:48

+0

這些測試運行沒有向關係數據庫寫入任何內容。我從關係數據庫中查詢了1.000批次(這需要幾秒鐘的時間,主要是因爲我正在檢索完整的實體,而不僅僅是名稱)。之後,我查詢MongoDB 1.000次(每個藝術家一次)檢索他們的歌曲。我認爲這是大量的單個查詢花費時間,這就是爲什麼我更願意完成這個服務器端(即MongoDB端) – peterp 2012-02-02 13:00:41

回答

0

如果您經常需要檢查更改,請爲數據添加時間戳,然後將該時間戳合併到您的查詢中。例如,如果添加「created_ts」屬性,那麼您可以查找自上次運行批處理以來創建的記錄。

以下是讓蒙戈的交互更高效的一些想法:

  • 通過使用"in" query減少網絡開銷。玩弄藝術家ID陣列的大小,以確定什麼最適合您的情況。
  • 僅通過選擇或讀取所需的屬性來減少網絡開銷。
  • 請確保您的文檔是藝術家的indexed
  • 在Mongo服務器上,確保儘可能多的數據適合內存。無論你做什麼,從磁盤檢索數據都會變得緩慢。如果它不適合記憶,那麼你有幾個選擇 - 購買更多的記憶;縮小你的數據集(例如,你實際上不需要的屬性);碎片;等等
+0

感謝您的寶貴意見,特別是只選擇所需的字段,並使用$ in一批藝術家的查詢確實加快了速度。 :) – peterp 2012-02-02 16:57:51