appengine:如何在具有ancester的实体中按键查询实体?

时间:2012-10-05 13:29:43

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

我在Google AppEngine上的应用有问题,尤其是数据存储区。 这个故事有点长。我的数据模型如下所示:

  1. 用户可以创建实体。每个实体都具有以下属性: #1)。自动生成的密钥。 #2)。创造者。 #3)。一个数字。
  2. 在应用程序中,我正在执行以下查询: 一个)。按创建者查询实体(#2)。 B)。按number属性查询实体(#3)。 C)。按id(#1)查询实体。
  3. 我正在使用低级数据存储区API。现在,我尝试了几种有问题的方法:

    [方法1]:使用数据存储区,如果我使实体成为无父对象(没有ancester),那么事情就好了,尤其是数据可以通过Datastore.get(k)轻松实现查询'c'。

    方法问题1:由于数据存储“最终是一致的”,对于查询“a”,结果始终不会更新到日期。如果用户创建实体,然后列出他创建的所有实体,则新创建的实体始终缺失。它仅在几秒钟后刷新出现...尝试使用内存缓存,对案例没有帮助(或者我找不到好办法?)。

    为了解决上述问题,我改变了数据结构。这里是[方法2]:在创建每个实体时,根据创建者创建一个密钥,并将新实体作为密钥的子项。因此,用户创建的所有实体都是具有ancester的实体。因此查询'a'及时工作,查询'b'似乎也有效。

    Approach2的新问题:对于查询'c',它总是不返回任何内容。这是我的查询'c'。他们两个都找不到实体,总是:

    方法1:
        实体en = datastore.get(k)

    方法2:

    DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
    Query q = new Query(kind)
        .setFilter(FilterOperator.EQUAL.of(Entity.KEY_RESERVED_PROPERTY, k));
    Entity en = ds.prepare(q).asSingleEntity();
    

    另一种尝试:方法3: 将所有实体分组在一个祖先下。这克服了Approach1中的问题,可以使用祖先过滤器查询,因此可以检索结果。

    方法3的问题:这种结构将所有实体分组为一个实体组。根据Google数据存储区规范,写入操作最多可以每秒发生5次。这是我不想打的限制......

    我认为这种数据模型非常普遍。有没有合适的方法来构建数据?任何帮助表示赞赏。感谢...

1 个答案:

答案 0 :(得分:1)

由于问题的格式化,我不太确定你在问什么,但是......

按ID查询时,还必须包含父键。密钥包括父母和子数据,如果您只使用子数据,那么它将不会返回您要查找的内容,因为它不是“名称”。完整路径(祖先/孩子)是它的名字。

因此,将父项包含在您正在构建的项中,然后获取它。

key = parent, parent_ID, child, child_ID

作为

key = child, ID
如果它具有父级,

将不起作用,因为密钥不完整且无法返回您想要的数据。