【问题标题】:How to retrieve entities from datastore in reverse store order using objectify?如何使用objectify以反向存储顺序从数据存储中检索实体?
【发布时间】:2013-12-23 12:03:13
【问题描述】:

我有以下实体:

@Entity
public class ActionIndex extends EntityObjectAutoID {

    @Parent Ref<Action> action;
    @Id Long id;
    @Index List<Long> receivers;
....
}

我想检索最近添加到数据存储区的 10 个实体的键。但如果我使用这个查询:

ofy().load().type(ActionIndex.class).limit(10).keys().list(); 

当然我得到的是前 10 个实体而不是最后 10 个。根据Objectify's doc

如果此查询仅限于一个类,您可以对 @Id 属性进行排序 没有@Parent。请注意,这仅对下降很重要 排序;默认迭代是键升序。

您不能对@Parent 属性进行排序。

由于我的类有一个父类(我需要它拥有它),我可以做些什么来以反向添加顺序获取实体而无需添加额外的时间戳属性?

【问题讨论】:

  • 尝试在可以存储插入时间的每个实体中添加一个 Date 属性。比按该属性订购
  • 是的,这是一个可行的解决方案,但我想知道是否可以在不添加额外属性的情况下以某种方式对键进行排序。也许是不可能的

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


【解决方案1】:

我知道怎么做。为了按键排序,您只需要使用__key__ 作为属性。对于过滤,有一个称为 filterKey 的便捷方法,但就我所见,它的等效排序 (orderKey) 不存在。

ofy().load().type(ActionIndex.class).order("-__key__").limit(10).keys().list();

--- 编辑 ----

根据下面的 cmets,似乎必须使用 Date 属性。

【讨论】:

  • 请注意,这并不能保证您得到正确的排序 - 由于分散的 id 分配,id 可能会有很大的不同。即使使用旧的 id 分配器,它们也是按块分配的,不一定是单调的。
  • @stickfigure 感谢您的注意。这是一个超出我理解水平的问题。那么,我必须使用 Date 属性来保证正确的排序吗?这是唯一的解决方案吗?
  • 这是正确的想法,但请记住,即使是 Date 也不能保证准确的顺序,因为时钟可能会在多个实例上出现偏差。创建一个分布式的、单调递增的值是困难的。但是,如果您可以接受这一点,那么只要您每秒写入的次数不超过几百次,索引 Date 就应该可以工作(阅读有关表拆分的信息)。
  • 您的解决方案对我来说是一个足够好的近似值(它适用于我分配增加 id 的种类),但由于没有索引而失败。我觉得这很奇怪 - 为什么 key/id 字段需要索引?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多