无法想出一个好的mongodb架构

时间:2013-07-23 17:15:32

标签: mongodb schema-design

我正在解决这个问题:

我正在构建一个IMGUR克隆,用户可以在其中上传图像,并且有一个“最新上传”页面,显示最近1000个上传的图像。

  • 用户可以在注册后立即上传图片
  • 在用户验证其电子邮件地址之前,他们的上传内容未显示在“最新上传内容”
  • 一旦用户验证了他们的电子邮件,他们的图像就会开始显示。
  • 如果用户被禁止,则他们的图片不会显示在“最新上传内容”

最初我有图片包含用户参考,我会选择填充用户的最后1000张图片。然后我会遍历返回的集合,丢弃被禁用或未经验证的用户拥有的图像。当未经验证的用户上传最后1000张图片时,这会被破坏。

我正在考虑在User对象上使用一系列内部Image文档,但这并不理想,因为用户可能拥有大量图像,而且在加载User对象时我并不总是想加载它们。 / p>

我对任何解决方案持开放态度

1 个答案:

答案 0 :(得分:1)

根据您对申请的了解,我会做以下事情:

两个不同的集合中应该存在两个实体:用户和上传。

上传集合将非常大,因此我们希望确保我们可以对集合进行索引和分片,以处理查询所需的规模和性能。话虽如此,上传中的一些关键元素是:

uploads=
{
_id:uploadId
user:{id:userId, emailverified:true, banned:false}
ts:uploadTime
.
.
.
}

可能的索引:

i. {ts:1,banned:1,"user.emailverified":1,"user.banned":1} (this index should be multi-purpose)
ii. {"user.id":1,ts:1}

请注意,我存储了一些冗余数据以优化您的最新1000查询。成本是在极少数情况下必须更新emailverified和banned,你需要在你的用户集合和上传集合上运行更新(这个需要multi:true)。

查询:

db.uploads.find({ts:{$gt:sometime},banned:false,emailverified:true}.sort({ts:-1}).limit(1000)