选择具有自定义随机概率分布的MongoDB文档

时间:2013-03-29 21:14:02

标签: mongodb

我有一个看起来像这样的集合:

[
  {
    "id": 1,
    "tier": 0
  },
  {
    "id": 2,
    "tier": 1
  },
  {
    "id": 3
    "tier": 2
  },
  {
    "id": 4,
    "tier": 0
  }
]

是否有标准的方法来选择 n 元素,其中选择最低层元素的概率是 p ,下一个最低层是(1- p )* p ,等等,标准随机选择元素?

例如,如果最可能的事情发生,我使用 n = 2和任何 p 对上述示例运行查询> .5(我认为永远都是这样),然后我会回来[{"id": 1, ...}, {"id": 4}]; n = 3,然后是[{"id": 4}, {"id": 1}, {"id": 2}]等。

E.g。这里有一些伪Python代码给出像 objs

这样的字典
def f(objs, p, n):
  # get eligible tiers
  tiers_set = set()
  for o in objs:
    eligible_tiers.add(o["tier"])
  tiers_list = sorted(list(tiers_set))
  # get the tier for each index of results
  tiers = []
  while len(tiers) < min(n, len(obis)):
    tiers.append(select_random_with_initial_p(eligible_tiers, p))
  # get res
  res = []
  for tier in tiers:
    res.append(select_standard_random_in_tier(objs, tier)
  return res

1 个答案:

答案 0 :(得分:0)

首先,在集合上启用地理空间索引:

db.docs.ensureIndex( { random_point: '2d' } )

要在X轴上创建一堆带有随机点的文档:

for ( i = 0; i < 10; ++i ) {
    db.docs.insert( { key: i, random_point: [Math.random(), 0] } );
}

然后你可以从这个集合中得到一个随机文件:

db.docs.findOne( { random_point : { $near : [Math.random(), 0] } } )

或者您可以检索最接近随机点的多个文档:

db.docs.find( { random_point : { $near : [Math.random(), 0] } } ).limit( 4 )

这只需要一个查询而不需要空检查,而且代码干净,简单且灵活。您甚至可以使用geopoint的Y轴为查询添加第二个随机性维度。

要进行自定义随机选择,您可以更改该部分[Math.random(), 0],以便最适合您的随机分布

来源:Random record from MongoDB