2011-03-15 102 views
11

我試圖將一個ObjectIds列表作爲數組字段存儲在文檔中。MongoDB如何處理大型數組字段?

我知道Mongo DB對單個文檔有4MB的大小限制。因此,考慮到ObjectId的長度是12個字節,文檔應該能夠處理一個數組字段中超過300,000個條目。 (讓我知道如果計算是關閉的)。

如果數組中的條目數量接近該限制,我可以期待什麼樣的性能?特別是當字段被索引時?任何內存問題?


典型的查詢看起來像下面:

查詢由單個值

db.myCollection.find(
    { 
    myObjectIds: ObjectId('47cc67093475061e3d95369d') 
    } 
); 

查詢由多個值

db.myCollection.find(
    { 
    myObjectIds: {$in: [ObjectId('47cc67093475061e3d95369d'), ...]} 
    } 
); 

添加一個新的值到多個文檔

db.myCollection.update(
    { 
    _id: {$in: [ObjectId('56cc67093475061e3d95369d'), ...]} 
    }, 
    { 
    $addToSet: {myObjectIds: ObjectId('69cc67093475061e3d95369d')} 
    } 
); 


+0

供參考:在1.8中,最大文檔大小已增加到16MB,並且此限制是10gen強加的軟限制。有人對此表示最好:(釋義)這個限制已經到位,迫使我們對我們的模式設計思考更加困難。 – 2011-03-15 13:59:14

+0

@Bryan Migliorisi謝謝,我遇到過這個帖子,並同意在模式設計上更聰明。 – Jaepil 2011-03-15 23:47:23

回答

4

TBH,我認爲你能做的最好的事情是基準它。創建一些虛擬數據,並在增加數組中項目的數量時測試性能。在您的環境中敲擊測試可能會更快 - 比等待這裏的答案

這是我的TODO列表中的一件事,用於調查和博客,但我還沒有完成。如果你這樣做,我一定會有興趣看看你的發現是什麼!同樣,如果我很快了解它,我也會在這裏發佈結果。

+0

沒有計劃做基準測試。但如果我這樣做,我會在這裏分享我的發現。謝謝。 – Jaepil 2011-03-15 23:49:18

2

除非在每次更新後使用​​,否則當您達到文檔大小限制時您將不會注意到。更新將失敗,並且會將消息記錄到數據庫日誌中。我從我的本地操作人員那裏得到了一些軼事證據,當有大量更新因文檔大小達到而失敗時,Mongo似乎正在努力工作。

我知道沒有簡單的方法來避免它,除了設計它。據我所知,沒有辦法有條件地推入清單。我在這裏看到過其他的問題,人們一直在試圖構建固定大小的列表等,但沒有找到好的解決方案。

+0

謝謝,我沒有真正考慮到達到極限時會發生什麼。顯然我需要更多地關注它。 – Jaepil 2011-03-15 23:52:22

4

隨着mongo 2.4的發佈,你可以使用capped數組。在插入時,你可以告訴mongo根據你的標準(如果你不關心把數據扔掉),按$排序和$分片數組以保持它的固定長度。例如,您可以使用它將最新的N個條目保存在數據日誌中。