【问题标题】:Query random row in ndb [closed]在ndb中查询随机行[关闭]
【发布时间】:2013-06-21 19:15:43
【问题描述】:

我正在尝试使用 webapp2 在谷歌应用引擎上开发一个网络应用。

我需要做的一件事是从 ndb 中检索一个随机数并显示它。有什么有效的方法可以让我这样做吗?

【问题讨论】:

标签: google-app-engine app-engine-ndb


【解决方案1】:

当您说“来自 ndb 的随机”时,我假设您的意思是随机记录。

如果您使用的是自动 ID,则可以使用以下方法。 (你的 id 的稀疏程度会影响它的成功程度)。

使用random.randrange(start, stop),开始为 0,停止为 (2^52)-1,给定新的 id 分配策略。

只查询大于从随机 id 创建的密钥的密钥。如果没有结果,请尝试获取密钥

获取 10 个(或一些)键

对先前提取返回的键序列随机选择random.choice(seq)

key.get() 选择的记录。

少数实体的替代方案说

只做一个keys查询和fecth所有的keys,然后在keys列表上做一个random.choice(),在选择的key上做一个db.get()。这将比任何循环解决方案快得多。如果您经常这样做并且可供选择的实体集不经常更改并且键列表的大小小于 1MB,则可以将键缓存在 memcache 中。

【讨论】:

  • 嘿,根据这个答案建议,我实现了一个超级简化的版本,因为使用 randrange 获取和查询键 对我不起作用(空值或相同值)。这是一个sn-p:1.获取所有密钥keys = Model.query().fetch(keys_only=True) 2.获取随机密钥key = random.sample(keys, 1)[0] 3.获取实体:return key.get()。当然,这可以很容易地扩展到支持实体范围。
  • 特定方法的好坏很大程度上取决于分配的 id 的数量和稀疏性。您可以在单个查询中获取所有键的事实属于我的少数实体限定符。另一种方法是用于数百万甚至更多的密钥。
【解决方案2】:

有一个 scatter 保留属性。我对此了解不多,但在map/reduce实现中提到过。

【讨论】:

  • 我不太清楚什么是分散保留属性
  • 你试过谷歌搜索吗?
  • 只能从按__scatter__属性排序的ndb中获取记录。 ndb 不允许检索实际属性 AFAIK。所以结果总是一样的。没有随机性。
【解决方案3】:

如果您的数据存储中的实体数量不是很大,那么您可以使用以下方法: 1、使用yourquery = entitykind.query()获取所有实体

2、使用yourquery.count()获取实体数量

3、使用随机数生成器在上述计数值内创建一个随机数

4、使用for循环遍历

返回的实体

yourquery.fetch()

然后当循环执行的次数等于上面的随机数时,在你的 webapp 中使用特定的实体

【讨论】:

  • 这适用于小数据集。如果您有大量实体,这将无法扩展。
  • 即使是小型集合,也有更好的方法,使用 offset=, limit=1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-13
  • 1970-01-01
  • 2011-03-30
相关资源
最近更新 更多