GAE数据存储 - 如何始终获得最新/最新结果并继续您离开的地方?

时间:2014-07-11 09:53:01

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

我使用Google App Engine(GAE),数据存储区(使用JDO)并使用Java进行操作。

我希望发生以下情况:

我们说我有以下型号:卡片,它只有一个字段,而且是创作时间(我称之为“#t;'”)。

我希望在发出GET请求时始终检索3个最新的Card实体。假设我目前在数据存储区中有5个卡实体,称为C1,C2 ... C5。它们按顺序插入,这意味着C5是最新的实体。

我现在执行我的GET请求,因此将获得实体:C5,C4和C3。在我使用客户端的实体后,让我们说5分钟后。我想检索接下来的3个最新实体。但是在这5分钟内,2个新卡已添加到数据存储区,现在看起来如下:C1,C2,C3,C4,C5,C6,C7。

我现在想要实际检索C7,C6以及最新但尚未检索到的卡,这意味着我也想要C2。即我想要C7,C6和C2。

我一直在尝试使用游标,而且似乎无法获得此行为。目前我正在使用查询对卡片进行升序排序,这意味着我将首先获得最旧的卡片,然后当我完成所有卡片时,Cursor实际上可以检测到何时添加了新条目并检索它们。但是如果自上次查询以来已经有超过3个添加它仍然会占用前3个(而不是最后3个),这意味着我将获得" new"牌。是否可以获得一个" end-cursor"没有真正走到尽头?如果有的话,我可能能够获得3张最新的最新卡片。

真实应用:想象一下9GAG的新鲜类别:最新的作品总是在顶部(简单)。但在我的应用程序中,以前的那些很可能永远不会再被看到,这意味着我想避免重复。所以它应该优先考虑最新的条目,当没有" new"卡片将继续在您上次离开的地方继续。

抱歉文字墙!并感谢任何反馈! :)

2 个答案:

答案 0 :(得分:1)

我将提供一个工作来获得你想要的......当你正在处理实时变化时,

  1. 将当前时间(ms)传递给查询并创建游标。
  2. 获取在您通过之前创建的实体。
  3. 保存您在客户端第一次传递的时间(ms),并且每次都传递它。
  4. 通过此操作,您可以忽略第一次请求后创建的实体。

答案 1 :(得分:0)

感谢@Bharath鼓舞我/让我以其他方式思考。我的解决方案受您的解决方案的启发然而,你的解决方案有点过于简单,因为我只能检索绝对最新的条目而我真的想要旧的条目,如果没有新条目并且能够返回到先前的位置。

我的解决方案如下:

如果我有条目:C5,C4,C3,C2,C1。它们按ASC排序,这意味着它是最新的条目。

如在OP中的示例中,我想要检索3张卡。然后我检索C5,C4和C3并将C5的时间戳保存为“newestTime”并将C3的时间戳保存为客户端上的“oldestTime”。有了这两个,我可以模拟数据存储区中的游标行为。

下次我检索卡片时,我首先尝试获取时间戳大于“newestTime”的卡片,这意味着它们更新。如果我得到少于3个结果,我会通过获得时间戳低于“最旧时间”的卡片来获取剩余的卡片数量,这意味着它们是我没有得到的问题。因此,“oldestTime”的工作方式类似于指向您检索的最后一个条目的光标。当“newestTime”和“oldestTime”查询返回少于3个结果时,这意味着没有更多的结果是“看不见的”,这意味着我们必须从头重新开始,所以我们从中检索剩余的卡开始(并强制更新“oldestTime”)。导致我在OP中描述的确切行为。

一些想法: 我的猜测是这个解决方案比使用游标效率更低,因为我总是需要按时间戳进行过滤,这是一个正确的假设,还是游标的作用,但是在内部?