我该如何处理mongodb中的共享图像?

时间:2013-05-05 09:16:33

标签: 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个db请求。更不用说所有的评论也需要2个db请求来获取图像URL ....

1 个答案:

答案 0 :(得分:0)

系统设计级别有两种方法 - 当有人更改其头像时,您是否应该让他们之前制作的帖子显示旧的或新的头像?

有些人可能会声称,如果您在发布时有头像[X],那么返回该帖子应该“永远”显示相同的头像图像。其他人可能会认为作者的头像图像是他们的标识符,应该更改它以匹配他们当前的头像[Y]。

如果你想做前者,你已经完成了:)

如果你想做后者,那么当作者将他们的化身从[X]更改为[Y]时,你可以运行一个更新,如下所示:

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

我在这里做了一些假设 - 一个是你存储作者的名字而不仅仅是avatar_img,另一个是每个帖子只能有一个作者,第三个是你的多重更新可能会被打断这就是为什么我的匹配条件是作者姓名他们的旧头像。

照顾作者。现在,评论呢?我要告诉你,将评论嵌入到帖子文档中是一个“糟糕的想法(tm)” - 你想要出于性能原因限制文档的持续增长,所以最多你可能会将前几条评论嵌入到文档中(这样您可以在显示帖子时显示前几条评论)但评论属于他们自己的集合,如果查看者要求查看更多评论,您可以在其中查询。一旦他们在一个单独的集合中,您可以像对帖子一样对其进行相同的更新(如果您愿意)。由于您将post中的数组元素数限制为少量注释,因此您可以使用另一个(或几个)更新命令轻松更新这些注释。

请注意,当用户更改其头像时,以非规范化形式更新头像将是异步的但是没关系,因为用户不会更改头像很多,您不关心更新是否需要更长时间,但您将获得巨大的收益通过优化最常用的操作来提高性能 - 只需一次读取就可以向视图显示帖子。