2014-07-11 13 views
1

我正在使用Google App Engine(GAE),Datastore(使用JDO)并使用Java进行操作。GAE数据存储 - 如何随时获取最新/最新结果并继续您离开的地方?

我想以下情况发生:

比方说,我有以下模式:卡,它只有一个字段,它是创建的时候(我称之为“TOC”)。

我希望在进行GET请求时始终检索3个最新的卡实体。假设我目前在数据存储区中有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。

我一直在试验游标,似乎无法得到这种行为。目前,我正在使用一种查询来对卡片进行升序排序,这意味着我将首先获取最早的卡片,然后当我完成所有卡片时,光标实际上可以检测何时添加新条目并检索它们。但是如果自从上次查询以来已经增加了3个以上,它仍然会取前3个(而不是后3个),这意味着我将获得最新的3张牌中最老的牌。是否有任何方法可以在没有真正达到最终结果的情况下获得“最终游标”?如果有的话,我可能会接受3张最古老的最新卡片。

现实生活中的应用:想象一下9GAG的新鲜类别:最新的条目总是在最前面(简单)。但在我的应用程序中,以前的很可能永远不会再被看到,这意味着我想避免重复。所以它应该优先考虑最新的条目,并且当没有“新”卡时,它将继续在你最后一次离开的地方。

对不起,文字的墙!并感谢您的任何反馈! :)

回答

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中描述的确切行为。

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

1

我会给周围的工作得到你想要的东西......因为你正在处理的实时变化,

  1. 传递当前时间(ms)的查询,并创建一个游标。
  2. 获取您经过的时间之前创建的实体。
  3. 保存您在客户端首次通过的时间(毫秒),并每次传递它。
  4. 有了这个,你可以忽略在第一次请求后创建的实体。
+0

谢谢您的输入!我会看看能否用这种方法来解决我的问题。甚至没有考虑使用时间戳作为结果的限制。我会回来并发布我的结果! – Whyser