从 MongoDB 集合中选择加权随机文档

tha*_*smt 5 random mongodb

我知道MongoDB实际上还不支持随机记录选择,但我找到了几种解决方法

但是,我想选择一个加权随机项目。这对 mySql来说相当容易,但我不确定使用 Mongo 的最佳方法。

我正在解决的问题是:我有一个收藏抽奖条目,根据用户分享/推广比赛的次数,他们会获得一个“额外条目”,以增加他们获胜的机会。我没有复制用户的条目,而是有一个字段来记录他们分享比赛的次数。我想用这个数字作为乘数来加权随机选择的“赢家”。

以下是我想到的几种方法:

  1. 使用Cookbook random selection method的变体,生成随机数数组(等于乘数),以便记录靠近查询的随机点的机会更大(但 Mongo 不支持数组 [多键] 索引,是吗?所以它可能很慢)
  2. 使用地理空间查询的 Cookbook random 方法的另一种变体,使用半径等于乘数的圆形多边形而不是简单的随机数(如果这甚至可能,我从未使用过 MongoDB 地理索引和查询)
  3. 在新的临时集合中展开条目,然后使用 MongoDB 随机选择方法之一
  4. 避免这个问题,首先将重复的条目存储在 Mongo 中,并定期随机选择 thingamajig
  5. 在 mySql 中保留一个单独的 MongoID 及其权重乘数的索引(不断同步,或按需生成)并使用 mySql 进行随机加权选择
  6. 查询一个巨大的数组以在 PHP 中完成它并希望它不会耗尽内存!:/

我在这里有什么事情吗?对于我缺少的明显解决方案,还有其他建议吗?我将做一些实验,看看什么是有效的,但欢迎对我最初的想法提供任何反馈!!

性能需要“好”而不是“好”,因为这些比赛中没有一个可能会有数百万个条目(通常更像是 [数万] 万个),因此公平性/准确性比速度更重要。谢谢。