首页 文章

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

提问于
浏览
1

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

  • 用户可以创建实体 . 每个实体都具有以下属性:#1) . 自动生成的密钥 . #2) . 创造者 . #3) . 一个号码 .

  • 在应用程序中,我正在执行以下查询:a) . 按创建者查询实体(#2) . B) . 按number属性查询实体(#3) . C) . 按id(#1)查询实体 .

我正在使用低级数据存储区API . 现在,我尝试了几种有问题的方法:

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

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

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

方法2的新问题:对于查询'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 回答

  • 1

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

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

    因此,在您正在构建的键中包含父级,然后获取它 .

    key = parent, parent_ID, child, child_ID
    

    key = child, ID
    

    如果它有一个父项将无法工作,因为密钥不完整,它无法返回您想要的数据 .

相关问题