I'd like to know how they did it in the edit page of the datastore viewer and any help would be much appreciate. Seems pretty simple but can't figure it out. Here's a screenshot to show exactly what I mean.
3 回答
该类Key
有一个 kind 和(名称或 id),还有一个parent
,它将是 null 或另一个键。
从实体的 key 开始,可以打印 kind 和 id,然后查找 parent,打印它的 kind 和 id,然后查找它的 parent,打印 kind 和 id,等等。
请参阅https://developers.google.com/appengine/docs/java/javadoc/com/google/appengine/api/datastore/Key
字符串编码的 Key 确实包含其自身及其所有祖先的种类和 ID。在父字段为空之前循环服务器端没有问题(它基本上是字符串+对象操作,不涉及对数据存储的查询),以创建面包屑。
我不知道它是否已经在 JS 中完成了客户端,但它应该是可能的,因为它基本上是一个 base64 编码。Encode()
有关算法,请参见https://github.com/golang/appengine/blob/master/datastore/key.go中的函数。
这个在线工具对密钥进行解码和编码:http: //datastore-key.appspot.com。它还可以作为具有 JSON 输出的服务。Go 代码服务器端不发出数据存储查询。
Java 的答案可能是这样的:
这为您提供了Key
一个编码表示,然后您可以查询种类、命名空间、id、父项和 appId,这允许与上面评论中提到的 python 答案类似的处理。
例如,以下代码片段重新映射具有一个父项且最初来自另一个 GAE 应用程序的密钥:
String key = "sflkjsadfliasjflkhsa"; // replace this by a real key
// a not very elegant way to get the current app id
String appId = KeyFactory.createKey("dummy", 1).getAppId();
// here, the key is converted from an encoded String to a key object
Key keyObj = KeyFactory.stringToKey(key);
String oldAppId = keyObj.getAppId();
// if the app id is different, we have to convert the key
if (!appId.equals(oldAppId)) {
// creeate a new key with parent having the correct app id
Key parentKey = keyObj.getParent();
Key newParentKey = KeyFactory.createKey(parentKey.getKind(), parentKey.getId());
Key newKeyObj = KeyFactory.createKey(newParentKey, keyObj.getKind(), keyObj.getId());
// convert the key back to a String replacing the original one
String newKey = KeyFactory.keyToString(newKeyObj);
// replace this by a call to your logger
Log.warn(getClass(), "remapped key: appId: " + oldAppId + " -> " + appId + " oldKey: " + key + " -> " + newKey);
key = newKey;
}