首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AppEngine数据存储:分层查询

AppEngine数据存储:分层查询
EN

Stack Overflow用户
提问于 2016-09-20 11:02:58
回答 2查看 110关注 0票数 1

如果您正在处理记录的层次结构,其中大多数键都有祖先,那么在检索叶之前,您是否必须创建所有键的链?

示例(在Go中):

rootKey = datastore.NewKey(ctx, "EntityType", "", id1, nil) secondGenKey = datastore.NewKey(ctx, "EntityType", "", id2, rootKey) thirdGenKey = datastore.NewKey(ctx, "EntityType", "", id3, rootKey)

如何获得由thirdGenKey描述的记录,而不必为其上面的层次结构的所有级别声明键?

EN

回答 2

Stack Overflow用户

发布于 2016-09-20 14:12:25

为了获得一个单独的实体,它的键必须是全局唯一的-这是通过每个实体键在其实体组中是唯一的来实现的。出于这个原因,祖先路径形成了实体键的固有部分。

因此,获取具有强一致性的单个实体的唯一方法是指定其祖先路径。这可以使用get-by-key或祖先查询来完成。

如果您不知道完整的祖先路径,您唯一的选择是查询实体的属性,但请记住:

在您的application

  • you中,这可能不是唯一的,但最终会保持一致。
票数 2
EN

Stack Overflow用户

发布于 2016-09-20 15:56:14

补充tx802的答案:

如果要按键加载实体,则需要它的键。如果密钥是具有父密钥的密钥,则为了形成/创建密钥,您还需要事先创建父密钥。父键是键的一部分,就像数字ID或字符串名称一样。

从实现的角度看:datastore.Key是一个结构:

代码语言:javascript
复制
type Key struct {
    kind      string
    stringID  string
    intID     int64
    parent    *Key
    appID     string
    namespace string
}

为了构造具有父关键字的Key,还必须递归地构造父关键字。如果您发现它过于冗长而无法始终创建密钥层次结构,那么可以为它创建一个辅助函数。

为简单起见,让我们假设所有键都使用相同的实体名称,并且我们只使用数字ID。它可能看起来像这样:

代码语言:javascript
复制
func createKey(ctx context.Context, entity string, ids ...int) (k *datastore.Key) {
    for _, id := range ids {
        k = datastore.NewKey(ctx, entity, "", id, k)
    }
    return
}

使用这个helper函数,您的示例简化为:

代码语言:javascript
复制
k2 := createKey(ctx, "EntityType", id1, id2)
k3 := createKey(ctx, "EntityType", id1, id3)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39585053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档