2013-07-19 59 views
0

我正在開發一個使用mongodb的插件。該插件必須將一些.dcm文件(DICOM文件)作爲二進制文件存儲在數據庫中。之後,插件必須存儲文件的元數據,並且只能對這些元數據進行一些查詢。在MongoDB和GridFS中的性能

當然,我選擇了在GridFS的問題我來回答。因爲我可以使用相同的文件將二進制數據存儲在塊集合中,並將元數據存儲在文件集合中的元數據字段中(並繞過MongoDB的大小限制)。

但是另一個問題在我身上。這個解決方案會很好,但我同時存儲二進制數據和元數據。讓我解釋一下:首先我存儲二進制文件,然後檢索文件並從中讀取元數據並將元數據存儲在同一個文件中。出於某些外部原因,這對我來說是一種義務。所以我花了很多時間來檢索文件並重新恢復。對於更新從它已經存儲在文件的元數據,我使用此代碼:

GridFSDBFile file = saveFs.findOne(uri.getFileName()); 
    if (file == null) { 
     return false; 
    } else { 
     file.setMetaData(new BasicDBObject()); 
     file.save(); 
     return true; 
    } 

,我必須找到要修改它之前的文件,然後保存一遍的主要問題吧!

所以我的第一個問題是:有沒有從數據庫中,而不是findOne(字符串文件名)來檢索文件中的最佳方式?方法findOne(ObjectID id)是否更快? (我不這麼認爲,因爲我認爲fileName默認已經被索引,不是嗎?)

我試過另一種方式來做到這一點。爲了繞過這個問題,我決定存儲2個不同的文件,一個用於二進制數據,另一個用於元數據。在這種情況下,我沒有時間去檢索數據庫中的文件。但是我有兩倍多的文件......但我幾乎可以肯定它存在一個更好的方法來做到這一點!

所以我的第二個問題:你認爲我會用2件不同的藏品?一個使用GridF來存儲二進制數據,另一個使用經典的mongo存儲(或GridFS)來存儲metada?

謝謝你很多關於閱讀我和你的答案:)。

回答

1

關於第一個問題,無論是_id和文件名的字段默認索引。雖然_id字段是唯一的,但文件名不是。因此,如果你的文件具有相同的文件名,使用文件名獲取文件將比通過_id字段獲取文件要慢。

關於第二個問題,你可以隨時對你的文件插入任何GirdFS元數據。這意味着你不需要超過GridFS。使用GridFS插入數據,但在插入數據之前,將元數據分配給要插入的文件。這樣你可以使用元數據查詢文件。如果你想要的元數據對於所有文檔都是固定的,那麼你可以將這些字段編入索引,當然也可以查詢。