我会反正规化一点,并添加一个'喜欢'计数器字段到被喜欢的对象。对象获得喜欢时递增,当对象不被喜欢时递减。
db.test.insert({
stuff: "likable stuff",
likes: 7
})
然后我也有一个代表该对象是为喜欢的结果斗另一个领域。因此,例如,对象开始时这个字段设置为“普通”,并且在有人获得10个喜欢后,他们将成为“精英”。 (或任何你想要的)当它们达到该阈值时更新它。这里的想法是,在写入过程中进行工作会使读取操作更容易。
db.test.insert({
stuff: "likable stuff",
likes: 7,
status: "ordinary/elite",
})
好吧,现在选择基于#of likes定义的组中的对象组很容易吧? db.collection.find({ status: 'elite' })
要在这些集合中随机化文档选择,您可以随机跳过一定数量的记录,但这会导致可怕的性能并且无法扩展。
但是,您可以执行一个技巧,将随机生成的数字存储在文档中。
让我们插入这些家伙一个到测试数据库,并检查了
db.test.insert({
stuff: "likable stuff",
likes: 7,
status: "ordinary/elite",
random: Math.random()
})
让我们来看看文档现在:
{
stuff: "likable stuff",
likes: 7,
status: "ordinary/elite",
random: 0.9375813045563468
}
好,这里是这个变得很酷。做一个findOne()查询,其中状态:精英和 rand_num:$ gt {另一个随机生成的数字btw 0和1}。
db.collection.find({ status: "elite", random: { "$gt": new_rand_num } })
如果findOne()查询不返回结果,与$ LT再次这样做,你一定会在方向中的至少一个找到的文件。
现在让我们指出状态和随机。
db.collection.ensureIndex({ status: 1, random: 1} })
你觉得呢?
什么是'算法'?算法过去了'街道'? –
米奇请... –
我接受了你的建议,并用类似的列进行了非规范化处理。现在,我只是要使用skip方法,但是如果我看到数据增加和缩放问题,那么随机生成结果的方法似乎很棒! – MEURSAULT