我正在解决这个问题:
我正在构建一个IMGUR克隆,用户可以在其中上传图像,并且有一个“最新上传”页面,显示最近1000个上传的图像。
最初我有图片包含用户参考,我会选择填充用户的最后1000张图片。然后我会遍历返回的集合,丢弃被禁用或未经验证的用户拥有的图像。当未经验证的用户上传最后1000张图片时,这会被破坏。
我正在考虑在User对象上使用一系列内部Image文档,但这并不理想,因为用户可能拥有大量图像,而且在加载User对象时我并不总是想加载它们。 / p>
我对任何解决方案持开放态度
答案 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)