我正在尝试通过其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.我做错了什么?
答案 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
但说实话,你所做的事情是完全多余的,除非它只是一个练习,以了解最新情况和你试图往返一个键 - >查询 - >键