【发布时间】:2013-06-21 19:15:43
【问题描述】:
我正在尝试使用 webapp2 在谷歌应用引擎上开发一个网络应用。
我需要做的一件事是从 ndb 中检索一个随机数并显示它。有什么有效的方法可以让我这样做吗?
【问题讨论】:
标签: google-app-engine app-engine-ndb
我正在尝试使用 webapp2 在谷歌应用引擎上开发一个网络应用。
我需要做的一件事是从 ndb 中检索一个随机数并显示它。有什么有效的方法可以让我这样做吗?
【问题讨论】:
标签: google-app-engine app-engine-ndb
当您说“来自 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 中。
【讨论】:
keys = Model.query().fetch(keys_only=True) 2.获取随机密钥key = random.sample(keys, 1)[0] 3.获取实体:return key.get()。当然,这可以很容易地扩展到支持实体范围。
有一个 scatter 保留属性。我对此了解不多,但在map/reduce实现中提到过。
【讨论】:
__scatter__属性排序的ndb中获取记录。 ndb 不允许检索实际属性 AFAIK。所以结果总是一样的。没有随机性。
如果您的数据存储中的实体数量不是很大,那么您可以使用以下方法:
1、使用yourquery = entitykind.query()获取所有实体
2、使用yourquery.count()获取实体数量
3、使用随机数生成器在上述计数值内创建一个随机数
4、使用for循环遍历
返回的实体yourquery.fetch()
然后当循环执行的次数等于上面的随机数时,在你的 webapp 中使用特定的实体
【讨论】: