2014-10-28 22 views
1

我有一個大約200M +文檔的Mongo DB。每個文檔都有一個「名稱」字段(索引),它是一個字符串和一個「項目」字段(未編入索引),它是一個整數數組。陣列的大小可以在1到100之間。檢索一個大的固定的標識符集的Mongo文檔

假設我有一個包含大約1M個名稱的txt文件。我需要爲每個這些1M名稱創建另一個包含「條目」的txt文件。

選項:

  • 通過名字在一個基於_id時間和提取物品只是迭代。
  • 創建一小組名稱(比如每次100個)的「批處理」,並使用$in運算符查詢數據庫。之後逐個遍歷文檔。
  • 使用某種map-reduce來分解1M名稱並並行查詢它們。

什麼是最有效的方法呢?

回答

1

這是很難回答,沒有嘗試和分析。

由於數組很小,並且假定每個名字都會被找到,那麼數據庫的自然順序蠻力掃描甚至可能比您建議的任何選項都快。

使用並行掃描(http://docs.mongodb.org/manual/reference/command/parallelCollectionScan/),您可以迭代所有文檔;您可以輕鬆地在內存中保存1M名稱,並且大約每200條記錄就會找到一條匹配項以寫入輸出文本文件。

+0

我不知道關於parallelCollectionScan,謝謝指點我。如果名稱數量接近總文檔數量,例如,而不是1M名稱,10M名稱是否會比說100K名稱的效果更好,您認爲parallelCollectionScan會更好嗎? – user2602740 2014-10-29 01:07:49

+0

隨着數量的增加,丟棄的記錄百分比下降。在200M下,平行掃描將盡可能快地得到。在1記錄這是關於你可以做的最糟糕的。準確地說,這些極端之間的界限以及它跨越其他解決方案的界限很難預測。我一直都很驚訝暴力解決方案對'聰明'的解決方案做得如何:大多數磁盤和內存架構都是爲了處理愚蠢的順序過程而設計的。你真的需要使用你選擇的硬件進行基準測試。 – 2014-10-29 03:30:11

+0

謝謝,是的,我會仔細檢查一下,看看什麼是最好的。另一個問題 - 我在apidoc中看到parallelCollectionScan不適用於分片羣集。你知道這是爲什麼嗎? – user2602740 2014-10-29 15:01:35

相關問題