如何使用Objectify从Google App Engine数据存储中获取随机元素?我应该获取所有实体的密钥并从中随机选择还是有更好的方法?
答案 0 :(得分:2)
存储时,为每个实体分配0到1之间的随机数。要获取随机记录,请生成0到1之间的另一个随机数,并查询具有大于该值的随机值的最小实体。
答案 1 :(得分:0)
您无需取全部内容。 例如:
改进(在缓存中使用较小的密钥表)!
首次阅读后记住每个X元素。 缓存id-s及其位置。因此,下次从所选id进一步查询条件(max“.limit(rnd%X)”将为X-1)。
随机只是随机的,如果它不需要接近100%公平,推测慢性字段值(例如,如果您在10天内有1000条记录,则随机501选择第二元素大于第五天)。
其他选项,如果您有慢性字段日期(或类似),则获取比随机日期更早的元素,然后使用更年轻的随机日期+ 1(您需要知道第一个日期和最后日期)。第二个在提取的记录之间选择随机。如果查询为空,请选择大于等...
答案 2 :(得分:0)
引自this post关于从Objectified数据存储中选择一些随机元素:
如果你的id是顺序的,一种方法是随机选择5 已知正在使用的id范围内的数字。然后使用带有的查询 “in”filter()。
如果你不介意相邻的5个条目,你可以使用count(), limit()和offset()随机查找5个条目的块。
否则,您可能需要使用limit()和offset()来 随机选择一个条目。
- 乔希
答案 3 :(得分:0)
我几乎适应了Matejc提供的算法。但是,有三件事:
我没有使用count()或数据存储区服务工厂(DatastoreServiceFactory.getDatastoreService()),而是有一个实体来跟踪我感兴趣的实体的总数。这种方法的原因就是它: 一个。当你处理很多对象时,count()可能会很昂贵 湾您无法在本地测试数据存储区服务工厂...在prod中进行测试只是一种不好的做法。
生成随机数:ThreadLocalRandom.current()。nextLong(1,maxRange)
我没有使用limit(),而是使用offset,所以我不必担心“排序”。