2013-05-05 24 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)” - 你想限制文档出于性能方面的持续增长,所以最多可以将前几个评论嵌入文档本身(以便您可以在显示帖子时显示前几个注释),但注释属于它们自己的集合,如果查看器要求查看更多注释,则可以查询它们。一旦他们在一个单独的集合中,您可以像对待帖子一样对它进行相同的更新(如果您想要的话)。由于您将发布的数组元素的数量限制为少量注释,因此您可以使用另一个(或几个)更新命令轻松更新这些注释。

请注意,当用户更改其头像时,以非正规化形式更新头像将会异步,但这没关系,因为用户不会更换头像,您不关心更新是否需要更长的时间,但是您会获得更多通过优化最频繁的操作,从而获得巨大的性能优势 - 只需一次读取即可将视图显示在视图中。