2016-03-04 51 views
1

我應該將對象存儲在數組中還是存儲在具有最高寫入速度的對象中?將數據作爲對象存儲在MongoDb中用於寫入性能


我試圖決定數據是否應該被存儲作爲對象的陣列,或使用的mongodb文檔內嵌套的對象。

在這種特殊情況下,我跟蹤一組不斷更新的文件,這些文件是我添加和更新的,文件名作爲密鑰和文件中處理的行數。

文件看起來像這樣

{ 
    t_id:1220, 
    some-other-info: {}, // there's other info here not updated frequently 
    files: { 
    log1-txt: {filename:"log1.txt",numlines:233,filesize:19928}, 
    log2-txt: {filename:"log2.txt",numlines:2,filesize:843} 
    } 
} 

或本

{ 
    t_id:1220, 
    some-other-info: {}, 
    files:[ 
    {filename:"log1.txt",numlines:233,filesize:19928}, 
    {filename:"log2.txt",numlines:2,filesize:843} 
    ] 
} 

我想提出一個假設,即處理文檔,尤其是當它涉及到更新,更容易對付的對象,因爲對象的位置可以由名字確定;不像數組,我必須查看每個對象的值,直到找到匹配。因爲對象鍵將有句點,所以我需要轉換(或刪除)句點才能創建一個有效的鍵(fi.le.logfilelogfi-le-log)。 我並不擔心文件可能出現重複名稱(例如fi.le.logfi-le.log),所以我更願意使用對象,因爲文件數量相對較少,但更新頻繁。

或者,它會得到更好的最佳寫入性能分別收集來處理此數據...

{ 
    "_id": ObjectId('56d9f1202d777d9806000003'),"t_id": "1220","filename": "log1.txt","filesize": 1843,"numlines": 554 
}, 
{ 
    "_id": ObjectId('56d9f1392d777d9806000004'),"t_id": "1220","filename": "log2.txt","filesize": 5231,"numlines": 3027 
} 
+2

一個快速測試值得大量猜測...... – dandavis

+0

't_id'表示什麼? – AxxE

+0

它的一個模糊的id,意義在於有多個't_id's並且每個都有多個'file_name's(1:m) – Daniel

回答

2

從我瞭解你所談論的寫入速度,沒有任何讀審議。所以我們必須考慮如何插入/更新文檔。

我們來對比(假設你知道要更換_id,通過密鑰名稱替換{key},在你的榜樣log1-txtlog2-txt):

db.Col.update({ _id: '' }, { $set: { 'files.{key}': object }}) 

VS

db.Col.update({ _id: '', 'files.filename': '{key}'}, { $set: { 'files.$': object }}) 

第二一個意味着MongoDB必須瀏覽數組,找到匹配的索引並更新它。第一個意味着MongoDB只更新指定的字段。

最壞:如果匹配filename不存在於陣列中 第二命令將不起作用!所以你必須執行它,檢查nMatched是否爲0,並且如果是這樣的話就創建它。那是真的寫入速度不好(請看這裏MongoDB: upsert sub-document)。

如果你永遠不會/幾乎從不使用讀取查詢/聚合框架對這個集合:去第一個,這會更快。如果你想聚合,展開,對你分析過的文件做一些分析,以獲得關於文件大小和行數的統計信息,你可以考慮使用第二個,你會避免一些頭痛的問題。

第一個解決方案的純寫入速度會更好。

+0

我同意答案。這是便利和速度之間的折衷。這些對象具有相似的性質,因此數組就是*自然*,尤其是如果您打算對所有文件執行某些操作。對於這兩種選擇,插入的寫入速度不會有很大的不同。即使對於更新,除非你有大量文件(在這種情況下,第三個選項對我來說聽起來更好),它不會被注意到。 – user3392439

相關問題