通过GO中的GAE中的int Id获取实体

时间:2014-04-17 06:14:48

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

我正在尝试通过其int Id获取实体密钥。 (不是实体本身,但它是关键)(从长远来看,我这样做是为了找到父母的实体)

Data from DatastoreViewer:

Entity Kind
File
Entity Key
ag9kZXZ-dHJhc2hib3hhcHByIgsSBEZpbGUYgICAgICAwAoMCxIERmlsZRiAgICAgIDACww
ID
6473924464345088
Parent
ag9kZXZ-dHJhc2hib3hhcHByEQsSBEZpbGUYgICAgICAwAoM
File: id=5910974510923776

我这样做:

k := datastore.NewKey(c, "File", "", 6473924464345088, nil)
currentDirQuery := datastore.NewQuery("File").Filter("__key__ =", k).KeysOnly()
keys, err := currentDirQuery.GetAll(c, nil)

密钥长度为0.我做错了什么?

1 个答案:

答案 0 :(得分:1)

如果您已经拥有密钥,为什么只进行密钥查询匹配密钥?为什么不做一个数据存储。用密钥获取()?

至于为什么你的keys_only查询不起作用,你没有在你正在构建的密钥中包含祖先,你的示例中的密钥有一个你显示的父亲ag9kZXZ-dHJhc2hib3hhcHByEQsSBEZpbGUYgICAgICAwAoM这个密钥的urlsafe版本必须有一个如果您指定祖先,则为parent。

使用python我们可以解码这个键

> ndb.Key(urlsafe="ag9kZXZ-dHJhc2hib3hhcHByIgsSBEZpbGUYgICAgICAwAoMCxIERmlsZRiAgICAgIDACww")
Key('File', 5910974510923776, 'File', 6473924464345088, app='dev~trashboxapp')

请参阅父键Key('File', 5910974510923776)

您无法使用为查询创建的密钥对子项执行部分匹配。您只能执行祖先查询,这些查询将返回祖先及其所有子项,而不管层次结构的深度。

这也意味着数据存储.Get()将使用您在示例代码中创建的密钥失败。

所以构建你的密钥以便它包含祖先 - 请参阅文档https://developers.google.com/appengine/docs/go/datastore/entities#Go_Retrieving_an_entity

但说实话,你所做的事情是完全多余的,除非它只是一个练习,以了解最新情况和你试图往返一个键 - >查询 - >键