2012-01-24 86 views
4

我正在使用MongoDB來存儲用戶配置文件,現在我想使用GridFS爲每個配置文件存儲圖片。在文檔中存儲對gridFS文件的引用的最佳方式是什麼?

兩種方式我比較連接兩個文件是:

A)存儲在用戶的image領域的文件ID的引用:

User: 
{ 
    "_id": ObjectId('[user_id here]'), 
    "username": 'myusername', 
    "image": ObjectId('[file_id here]') 
} 

B)存儲到一個參考用戶在文件的元數據:

File metadata: 
{ 
    "user_id": ObjectId('[user_id here]') 
} 

我知道在很多方面它給我和依賴於應用程序的細節(這將是移動的,如果這能幫助),但我我只是想知道這樣做是否有任何普遍的好處?

回答

3

這裏的答案實際上取決於您的應用程序的使用模式。我的假設(隨時糾正我)是最有可能的模式是這樣的:

查找用戶 - >查找用戶 - >顯示配置文件(取圖片)

有了這個廣義的使用情況,使用方法A,找到用戶文檔,顯示配置文件),其中包含圖像對象標識,然後使用該標識獲取文件(2個基本操作並完成)。

注:從我治療作爲一個單一的邏輯操作GridFS的文件的實際取,在現實中也有涉及到多個操作,但大部分車手/ API的掩蓋這個反正。

採用方法B,你將不得不找到用戶文檔,然後做另一個查詢來查找文件的元數據集合中的相關USER_ID,然後去獲取文件。根據我的統計,這是三個操作(對於方法A,您還沒有找到額外的操作)。

這有道理嗎?

當然,如果我的假設是不正確的,你的應用程序(例如)圖像驅動的,那麼你的查詢模式可能會想出一個不同的答案。

+0

謝謝 - 你能澄清一下嗎?我假設方法B我可以1)獲取用戶,2)獲取具有元素的文件與先前檢索的用戶的用戶ID。我沒有文件元數據的經驗,所以這些的細節將是錯誤的,但我想象的東西像$ grid-> findOne(array('metadata'=> array('user_id'=> ObjectId('[user_id這裏]'))))(使用PHP驅動程序)..是不可能的? –

+0

當你提到元數據時,我認爲你指的是一個單獨的集合,而不是GridFS使用的文件集合 - 默認情況下,它不包含user_id,所以我在我的腦海默認了上面的。 當然,您可以將user_id添加到文件集合,並允許您直接查詢它。 那是,那麼你必須確保索引文件收集正確的情況下進行優化您的查詢,而不是使用「標準」 GridFS的設置 - 更適合你要記住,但同樣有效。我仍然會選擇方法A,但由您決定:) –

+0

感謝您的幫助! –

相關問題