App引擎 - 数据存储区,NOT EQUAL(!=),30子查询限制

时间:2013-12-02 10:56:34

标签: java google-app-engine google-cloud-datastore

使用Java,Google App Engine及其数据存储区。 我知道之前有很多这样的问题,但是我无法理解我所做的事情是否有可能,或者我做错了。

我想做什么: 假设我有100个问题作为问题实体。我希望用户下载例如20个问题并回答它们。然后用户应该下载另外20个问题,但我想确保它与之前的问题不同。什么是最好的方法?

我目前向用户发送了20个问题,每个问题都有唯一的ID。然后,当他们再请求20个问题时,用户还会回复他回答的问题(换句话说,20个问题的ID)。当我然后通过调用query.setFilter(“id!= 1&& id!= 2&& ...&& id!= 20" )。这是“问题”,在这种查询中我可以拥有多少'!='(NOT EQUAL)?因为第三次用户请求新问题时,过滤器不仅仅是20个条件长,而是60条件长。这可能吗?这是一种有效的做事方式吗? '!='每次使用时都会创建一个新的子查询吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

听起来像你需要的'光标'。

  

查询游标允许应用程序检索查询的结果   方便的批处理而不会产生查询偏移的开销。   在执行检索操作之后,应用程序可以获得a   cursor,这是一个标记索引的不透明的base64编码字符串   检索到的最后一个结果的位置。应用程序可以保存它   string(例如,在数据存储区中,在Memcache中,在任务队列中)   任务有效负载,或作为HTTP GET或POST嵌入到网页中   参数),然后可以使用光标作为a的起点   后续检索操作以获得下一批结果   从前一次检索结束的点开始。检索可以   还指定结束游标,以限制结果集的范围   返回。

https://developers.google.com/appengine/docs/java/datastore/queries#Java_Query_cursors

您必须小心使用它,请参阅链接以获取更多详细信息。

答案 1 :(得分:0)

我会看看有关获取随机记录的这两个问题。

Get a random entity in Google App Engine datastore which does not belong to a list

Query random row in ndb

在您的情况下,选择一个随机集,然后过滤掉已经回答的问题,这将比您当前尝试执行的查询更有效。

如果您在问题的已知整数范围内预先分配ID,则可以使用为用户存储的位图来检查针对它的问题的关键字,并根据已完成的问题ID设置位。这比使用钥匙更快。