2013-05-05 64 views
2

可以說我有一個嵌入式作者的Posts文檔。我應該如何處理mongodb中的共享圖像?

{ 
    name: "some post", 
    text: "some text", 
    author:{ 
     avatar_img: "http://www.someimage.com/1" 
    }, 
    comments: [ 
     { 
      user: "some name" 
      avatar_img: "http://www.someimage.com/5" 
     } 
    ] 
} 

現在讓我說我在前端使用這些數據並在頁面上顯示作者的圖像。當作者更改他的頭像網址時會發生什麼?我將不得不更新每個帖子與新的圖像網址。這是做到這一點的正確方法嗎?我看到的唯一選擇是引用「用戶」文檔,但每個帖子都會有2分貝的請求。更不用說所有的評論還需要2分貝的請求來獲取圖像的URL以及......

+0

是的,你可能需要全部更新它們或提出兩個請求。似乎您可以將圖片網址緩存到您的網絡或應用程序層中,這樣如果您想避免第二次請求,就不需要不斷檢索它們。 – WiredPrairie 2013-05-05 13:00:32

回答

0

系統設計級別有兩種方法 - 當有人改變他們的頭像,你應該讓他們以前的職位顯示舊的還是新的化身?

有些人可能會聲稱,如果您在發佈時擁有頭像[X],那麼回到該帖子應該顯示「永遠」相同的頭像圖片。其他人可能認爲作者的頭像圖像是他們的標識符,應該改變它以匹配他們當前的頭像[Y]。

如果你想要做的是前者,你已經做了:)

如果你想要做的是後者,那麼當一個作家改變來自[X]他們的頭像[Y],那麼你可以運行一個更新這將是這樣的:

db.posts.update({ "author.name":"joejoe", "author.avatar_img":"[X]"}, 
       { $set:{"author.avatar_img":"[Y]"}}, 
       { multi : true } 
       ); 

我在這裏做了一些假設 - 一個是您將作者的名字,而不僅僅是avatar_img,另一種是每一個職位只能有一個作者,第三是你的多更新可能會被打斷,這就是爲什麼我的匹配條件是作者姓名 thei舊的頭像。

這需要照顧作者。現在,評論怎麼樣?我要告訴你,在帖子文檔中嵌入評論是一個「壞主意(tm)」 - 你想限制文檔出於性能方面的持續增長,所以最多可以將前幾個評論嵌入文檔本身(以便您可以在顯示帖子時顯示前幾個註釋),但註釋屬於它們自己的集合,如果查看器要求查看更多註釋,則可以查詢它們。一旦他們在一個單獨的集合中,您可以像對待帖子一樣對它進行相同的更新(如果您想要的話)。由於您將發佈的數組元素的數量限制爲少量註釋,因此您可以使用另一個(或幾個)更新命令輕鬆更新這些註釋。

請注意,當用戶更改其頭像時,以非正規化形式更新頭像將會異步,但這沒關係,因爲用戶不會更換頭像,您不關心更新是否需要更長的時間,但是您會獲得更多通過優化最頻繁的操作,從而獲得巨大的性能優勢 - 只需一次讀取即可將視圖顯示在視圖中。