AppEngine数据存储Golang:获取查询结果的祖先

时间:2016-08-09 13:02:33

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

是否可以获取查询结果的祖先密钥?基于数据存储文档(https://cloud.google.com/appengine/docs/go/datastore/reference#Query.Run),query.Run()结果只有一个Cursor()和一个Next()函数,它们都不会引导您进入祖先。看起来这应该是范围内的信息,除非Datastore的机制阻止它。是否由开发人员将祖先写入孩子的房产(具有匹配类型)(如果我们愿意承担费用)?

1 个答案:

答案 0 :(得分:2)

如果您的查询返回结果,则祖先包含在实体Key中。

实体密钥由Iterator.Next()返回,例如:

func (t *Iterator) Next(dst interface{}) (*Key, error)

从密钥中,使用Key.Parent()方法获取祖先。

见这个例子:

query := datastore.NewQuery("MyEntity")

e := MyEntity{}
for i := query.Run(ctx); ; {
    if k, err = t.Next(&te); err == nil {
        log.Infof("Ancestor / parent key: %v", k.Parent())
    }
}

请注意,祖先存储在datastore.Query中,但不会导出:

type Query struct {
    ancestor *Key
    // ...
}

datastore.Iterator返回的Query.Run()包含Query,但它也未被导出:

type Iterator struct {
    // q is the original query which yielded this iterator.
    q *Query
    //...
}

所以你不能访问这些结构域,你最好的选择是结果中的实际实体(或者更确切地说是它的键)。